Удаленное удаление и обновление 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

Надеюсь, это поможет кому-то еще.