Удаленное удаление и обновление Rails через Ajax

В прошлом, всякий раз, когда я хотел обновить часть своего представления через Ajax, я делал следующее:

  1. создайте часть части, которую я хочу обновить, и дайте ей уникальный идентификатор, скажем, #tracks
  2. создайте специальное действие в контроллере для этого вызова Ajax, скажем, remove_track, которое обновляет все значения и т. д., и добавьте format.js
  3. создайте новый JS-файл с тем же именем, что и действие, чтобы Rails автоматически вызывал его remove_track.js.erb, который содержит что-то вроде: $('#tracks').html("<%=j render 'cds/show_tracks' %>");
  4. установите remote: true в ссылке, которая вызывает это действие.

Все это хорошо, но теперь я пытаюсь удалить и обновить обычное представление index, используя обычный метод destroy для гибкости, то есть я могу вызывать этот метод либо через Ajax, либо обычным образом. Я подумал, что это такое обычное дело, что должен быть лучший способ, чем все вышеперечисленное.

Я могу заставить метод destroy вызывать мой файл destroy.js.erb, просто поместив это в контроллер:

  format.js { layout: false }

ну и конечно установка remote: true по ссылке.

то, что я не могу сделать, это обновить представление. Таблица, которую я хочу обновить, заключена в div с уникальным идентификатором, но поскольку она не является частичной, она отказывается обновлять содержимое. Может быть, я что-то упускаю.

Обречен ли я создавать партиал и обновлять его описанным выше методом, или есть более волшебный способ сделать это (кроме использования Turbolinks)?

Спасибо.

PS Кроме того, я только что заметил, что у этого есть дополнительный недостаток, заключающийся в том, что я не могу передать остальные параметры методу уничтожения, поскольку он передает только идентификатор объекта для уничтожения с использованием обычных маршрутов CRUD. Если я пытаюсь использовать platform(action: destroy) или platform(method: delete), я получаю сообщение об ошибке:

No route matches {:action=>"destroy", :controller=>"platforms"}

Это означает, что я должен создать новый маршрут, если я хочу передать эти параметры...

Еще одним недостатком всего этого является то, что я повторяю всю логику поиска и сортировки, которая у меня есть в методе индекса, снова в методе уничтожения. Я уверен, что это определенно не способ сделать это.


person kakubei    schedule 18.07.2013    source источник


Ответы (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

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

person kakubei    schedule 19.07.2013
comment
Спасибо большое. Это отлично сработало для меня. Вероятно, вам следует пометить его как принятый ответ или написать код в ответе здесь. - person marcamillion; 15.10.2014
comment
Спасибо, что поделились этим, это действительно помогло мне. Внешние сообщения в блогах имеют неприятную привычку исчезать, поэтому я отредактировал ваш ответ, включив соответствующий код на всякий случай. - person Stephen Lead; 18.06.2019