Rails & AJAX, есть ли причина, по которой вы не должны отображать html представление непосредственно в действии контроллера для обработки ajax? - PullRequest
0 голосов
/ 09 февраля 2020

Классифицированный c способ работы с Rails & Ajax всегда выглядит примерно так:

// JS - let's assume this submits to dummies#create
$(form).submit()

# Dummies Controller
def create
   @dummy = Dummy.new(dummy_params)
   respond_to do |format| 
     format.js
   end
end

# /views/dummies/create.js.erb
$("page").append("<%= escape_javascript(render partial: 'dummy_view' ) %>"); 

# /views/dummies/_dummy_view.html
<h1><%= @dummy.name %></h1>

Мне всегда было любопытно, потому что вышеприведенное, кажется, создает случайный * Файл 1004 * с очень небольшим количеством мяса ... есть ли причина (например, это ужасное соглашение, или ужасно небезопасно или что-то в этом роде), почему вы НЕ должны вместо этого просто рендерить представление прямо на ajax?

// JS - basically takes responsibilites of create.js and puts it into the always
$.ajax(...).always(function(xhr, status){
    $("page").append($(xhr['responseText']))
    // responseText contains the partial rendered by the controller action
})

# Dummies Controller
def create
   @dummy = Dummy.new(dummy_params)
   render partial: 'dummy_view'
end

# /views/dummies/_dummy_view.html
# unchanged
<h1><%= @dummy.name %></h1>

Примечание выше - псевдокод, извинения за мелкие ошибки. Тем не менее, концептуальная идея и вопрос остаются неизменными.

1 Ответ

0 голосов
/ 09 февраля 2020

create.js.erb не является случайным, это представление для действия с ожидаемым форматом.

Как правило, у вас может не быть такого простого представления (у вас могут быть другие селекторы, отличные от "page", у вас может быть дополнительный js код, который будет выполнен после или до добавления), представление / скрипт js является общим решением для запроса ajax, чтобы дать ответу полный контроль над тем, что делать.

Вы можете иметь то, что хотите, но это будет работать только для вашего конкретного случая, когда селектор всегда «страница», и вы хотите добавить html только к этому элементу. Ничто не мешает вам сделать это (хотя вы, возможно, захотите использовать пользовательский запрос ajax, а не запрос rails, поскольку он задает формат js по умолчанию и выполняет скрипт ответа).

Соглашение состоит в том, что удаленный запрос rails создает скрипт js, вы можете выйти из соглашения, если хотите. Вы потеряете большую гибкость с вашим подходом как есть (например ... что если действие create завершится неудачно и вам нужно отобразить ошибки?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...