Проблема обратного вызова удаленного запроса Rails 4 с типом данных JS - PullRequest
0 голосов
/ 03 октября 2018

У меня проблема с Rails 4.1.6, Ruby 2.3.0, JQuery 1.11.1 (jquery-rails 3.1.1, coffee-rails 4.0.1), я приведу простой пример, чтобы объяснить мою проблему:

У меня есть представление со списком элементов, которые создаются с помощью Ajax.На нем есть кнопка для создания нового пустого элемента, удаленно:

button_to "Add Item",
          { action: :create },
          form: { id: "add_item_form" },
          remote: true

На моем Javascript я подключил событие:

$('#add_item_form').on('ajax:success', function (e, data){
  alert('Success!');
}

Контроллер:

def create
  @item = Item.new()
  @item.save!
  respond_to do |format|
    format.js
  end
end

Поскольку метод create отвечает только на JS, он попытается отобразить JS-представление с тем же именем, что нормально:

create.js.erb

$('#item_list').append("<%= escape_javascript(render partial: 'item_li', locals: { item: @item }) %>")

А по частям:

_item_li.html.erb

<li>
  <%= form_for(item, remote: true) do |f| %>
    // List of item fields from model
  <% end %>
</li>

Если я запускаю этот код, он работает нормально, и предупреждение показывает «Успех»! ", обратный вызов выполняется сразу после визуализации частичного представления.Проблема в том, что там, где это предупреждение, я хотел бы кое-что сделать с информацией о вновь созданном Предмете (например, с идентификатором), но я не могу найти способ вернуть Предмет, который я создал в контроллере, нафункция обратного вызова.

Поскольку я работаю с CoffeeScript, мой основной файл javascript и create.js.erb не могут взаимодействовать друг с другом (функции, объявленные в главном файле, недоступны из другого файла).

Если я поменяю свой контроллер на:

respond_to do |format|
  format.js
  format.json { render json: @item }
end

И поменяю тип данных на кнопке на «json», я получу элемент при обратном вызове, но при частичном просмотреникогда не будет достигнуто.Если я добавлю оба типа данных, то получу все, что есть на create.js.erb в переменной «data» обратного вызова.

Как лучше всего решить эту проблему?

1 Ответ

0 голосов
/ 03 октября 2018

Если я правильно понимаю вашу проблему, вы хотите иметь возможность делать что-то с @item в обратном вызове.

Вы должны иметь возможность манипулировать @item из create.js.erb вместо использования success callback.

Чтобы проверить это, я бы удалил это:

$('#add_item_form').on('ajax:success', function (e, data){ alert('Success!'); }

и затем добавил бы некоторый код Javascript в ваш файл create.js.erb:

$('#item_list').append("<%= escape_javascript(render partial: 'item_li', locals: { item: @item }) %>")
alert('Success!');
// Do whatever you want here, @item should be accessible 
...