link_to_remote в Rails отображает неверный URL при отображении из RJS - PullRequest
1 голос
/ 13 сентября 2009

У меня есть частичный элемент для гостевого объекта, который отображает ссылку на действие уничтожения следующим образом:

<%= link_to_remote "remove", :url => { :action => "destroy", :id => guest.id } %>

При вызове из представления ERB он работает нормально, например,

<div id="guests">

<% = визуализация: частичная => @ event.ghest%>

То есть, это выглядит примерно так:

<a href="#" onclick="new Ajax.Request('/guests/destroy/10', {[options removed]}); return false;">remove</a>

Проблема в том, что эта часть отображается в RJS в результате операции создания, подобной этой:

page.insert_html :bottom, :guests, :partial => @guest

Вместо того, чтобы ссылаться на действие уничтожения, вместо этого он ссылается на действие подробности / показа для гостя, например

a href="#" onclick="new Ajax.Request('/events/1/guests/10', {[options removed]}); return false;">remove</a>

Может кто-нибудь сказать мне, что я делаю неправильно, или если есть способ отладить, что здесь происходит? Как вы могли бы сказать, я полный новичок в Rails;)

Ответы [ 2 ]

3 голосов
/ 13 сентября 2009

Вы делали это почти правильно, но вы не совсем следуете соглашению. Позвольте мне объяснить.

Ссылки разработаны, согласно спецификации HTTP, как GET-запросы - поиск данных. Вы не должны использовать ссылки для изменения состояния ресурса. По сути, не используйте ссылки для потенциально разрушительных действий, поскольку за ними может следовать паук или ускоритель. Rails по умолчанию делает каждую ссылку GET-запросом. Итак, когда вы сделали это:

<%= link_to_remote "remove", :url => { :action => "destroy", :id => guest.id } %>

Он сделал запрос GET. Я предполагаю, что у вас есть в вашем файле rout.rb что-то вроде

map.resources: гости

Это создает тонну маршрутов, которые вы можете использовать следующим образом:

<%= link_to_remote "remove", :url => guest_path(guest) %>

Для маршрутов ресурсов в Rails используемый МЕТОД определяет вызываемое действие контроллера.

URL / guest / 1, вызываемый с помощью запроса GET, вызывает действие SHOW. Вы должны указать метод в своем вызове link_to_remote - либо: получить,: положить,: пост или: удалить. : put для обновления,: post для создания,: delete для, ну, в общем, удаления.

<%= link_to_remote "remove", :url => { :action => "destroy", :id => guest.id }, :method => :delete %>

или чище,

<%= link_to_remote "remove", :url => guest_path(guest), :method => :destroy %>

А если серьезно, не используйте ссылки. Используйте кнопки.

<%= button_to_remote "remove", :url => guest_path(guest), :method => :destroy %>

Надеюсь, это поможет!

2 голосов
/ 13 сентября 2009

Оказывается, "уничтожить" имеет особое значение в Rails. Вместо этого я переименовал действие уничтожения, и оно отлично работает.

...