Удаленное удаление и обновление Rails через Ajax
В прошлом, когда я хотел обновить часть своего представления через Ajax, я сделал следующее:
- создайте частичную часть части, которую я хочу обновить, и дадим ей уникальный идентификатор, скажем
#tracks
- создайте специальное действие в контроллере для этого вызова Ajax, скажем
remove_track
, который обновляет все значения и т.д. и добавляет format.js
- создайте новый JS файл с тем же именем, что и действие, поэтому Rails автоматически вызывает его
remove_track.js.erb
, который содержит что-то вроде: $('#tracks').html("<%=j render 'cds/show_tracks' %>");
- установите
remote: true
в ссылку, которая вызывает это действие.
Все это прекрасно, но теперь я пытаюсь удалить и обновить общее представление index
с помощью обычного метода destroy
для гибкости, то есть я могу назвать этот метод либо через Ajax, либо обычно. Я подумал, что такое общее дело, что должен быть лучший способ, чем все вышеперечисленное.
Я могу заставить метод destroy вызвать мой файл destroy.js.erb
, просто поместив его в контроллер:
format.js { layout: false }
и, конечно, установить remote: true
в ссылке.
то, что я не могу сделать, это получить представление для обновления. Таблица, которую я хочу обновить, заключена в div с уникальным идентификатором, но поскольку она не является частичной, она отказывается обновлять содержимое. Может быть, я что-то упустил.
Я обречен создать частичный и обновить его с помощью вышеописанного метода или есть более магический способ его выполнения (кроме использования Turbolinks)?
Спасибо.
PS
Кроме того, я просто заметил, что это имеет дополнительный недостаток: я не могу передать остальные параметры методу destroy, поскольку он только передает идентификатор объекта, чтобы уничтожить его с помощью обычных маршрутов CRUD. Если я пытаюсь использовать platform(action: destroy)
или platform(method: delete)
, я получаю сообщение об ошибке:
No route matches {:action=>"destroy", :controller=>"platforms"}
Что означает, что мне нужно создать новый маршрут, если я хочу передать эти параметры...
Еще одним недостатком всего этого является то, что я повторяю всю логику поиска и сортировки, которые у меня есть в методе индекса снова в методе destroy. Я уверен, что это определенно не способ сделать это.
Ответы
Ответ 1
Благодаря этой странице я нашел правильный способ сделать это. Так просто и эффективно.
http://carmennorahgraydean.blogspot.com.es/2012/10/rails-328-ajax-super-basic-example.html
Обновите строку уничтожения в index.html.erb:
<%= link_to 'Destroy', pony, method: :delete, data: { confirm:
'Are you sure?' }, :remote => true, :class => 'delete_pony' %>
Создайте файл destroy.js.erb, поместите его рядом с другими файлами .erb (в app/views/ponies). Это должно выглядеть так:
$('.delete_pony').bind('ajax:success', function() {
$(this).closest('tr').fadeOut();
});
Добавьте format.js {render: layout => false} в свой контроллер:
respond_to do |format|
format.html { redirect_to ponies_url }
format.json { head :no_content }
format.js { render :layout => false }
end
Надеюсь, это поможет кому-то еще.