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

Другие вопросы по тегам