Turbolinks 5 ajax POST
В моем приложении Rails 5 / Turbolinks 5 я хотел бы поместить html, полученный в результате отправки формы, в div.
Форма представляет собой
= form_for(user) do |f|
стандартная форма рельсов.
После успешной отправки редирект отправляется в браузер
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was created.' }
когда я отправляю форму через ajax:
$(".dialog").on("submit", "form", function(e){
e.preventDefault();
$.ajax({
url: $(this).attr("action"),
method: "POST",
data: $(this).serialize()
}).done(function(data) {
$(".dialog .canvas").html(data);
});
});
отправляется from и оператор redirect_to сервера перенаправляет браузер на страницу нового пользователя.
Перенаправление заставляет turbolinks заменять тело содержанием страницы, на которую был перенаправлен браузер. вместо этого я хочу заменить определенный div $(".dialog .canvas").html(data). Как я могу предотвратить такое поведение турболинков.
2 ответа
Если я понимаю, что вы пытаетесь сделать правильно, вы можете визуализировать HTML с сервера и обновить свой div
элемент с использованием JavaScript, созданного на вашем сервере.
# HTML form
<%= form_for @user, remote: true do |f| %>
...
<% end %>
# app/controllers/users_controller.rb
def create
@user = User.create(user_params)
# renders create.js.erb automatically with AJAX request (remote: true)
end
# app/views/users/create.js.erb
$("#my-div").html("<%=j render(partial: 'users/user', locals: { user: @user }) %>");
Обратите внимание, что в вашем js.erb
файлы, которые вы можете использовать как в Ruby, так и в JavaScript; Я нахожу это очень полезным для построения HTML и динамического контента и передачи его обратно клиенту для запуска в виде JavaScript.
Люди могут обсудить плюсы и минусы сгенерированного сервером JavaScript, но я считаю, что он отлично работает и работает хорошо. В противном случае вы должны поддерживать синхронизацию шаблонов сервера / клиента, что очень грязно; или вы должны сделать все свои шаблоны на стороне клиента и использовать ваш сервер только для JSON.
Я просто не думаю, что в будущем клиент / сервер будет разрушен таким образом, хотя есть много людей, которые утверждают, что это направление, в котором все идет. Достаточно взглянуть на множество JavaScript-фреймворков MVC, которые появляются.
С turbolinks 5.0.1, в контроллере добавить опцию turbolinks: false
т.е.
format.html { redirect_to @user, notice: 'User was created.', turbolinks: false }
Другое решение (не очень хорошее, потому что оно не позволит вам обновить до Rails 5.1) - придерживаться турболинков 2.5.3.
Могут быть другие решения с использованием format.js или даже format.json, проверьте: https://github.com/vtamara/turbolinks_prob50