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.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