У меня проблема с 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» обратного вызова.
Как лучше всего решить эту проблему?