Rails中的link_to_remote在从RJS呈现时呈现错误的URL

时间:2009-09-12 23:32:06

标签: ruby-on-rails prototypejs rjs

我有一个“客人”对象的部分,它提供了一个像这样的销毁动作的链接:

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

从ERB视图调用时,它可以正常工作,例如

<div id="guests">

&lt;%= render:partial =&gt; @ event.guests%&gt;     

也就是说,它呈现如下:

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

问题是,当这个部分是由于这样的创建操作而从RJS呈现时:

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

它不是链接到destroy动作,而是链接到guest虚拟机的detail / show动作,例如。

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

有谁能告诉我我做错了什么,或者是否有办法调试这里发生了什么?正如你可能会说的那样,我是Rails的完全新手;)

2 个答案:

答案 0 :(得分:3)

你做的几乎是正确的,但你并没有完全遵循惯例。请允许我解释一下。

根据HTTP规范,链接被设计为GET请求 - 数据检索。您不应该使用链接来修改资源的状态。基本上,不要使用链接进行潜在的破坏性操作,因为它们可能后跟蜘蛛或加速器。 Rails默认为每个链接都是GET请求。所以,当你这样做时:

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

它提出了GET请求。我假设你的routes.rb文件中有类似

的文件

map.resources:来宾

这会创建大量可以使用的路径:

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

使用Rails中的资源路由,使用的METHOD确定调用的控制器操作。

使用GET请求调用的URL / guests / 1调用SHOW操作。您需要在link_to_remote调用中指定方法 - get:put,:post或:delete。 :put用于更新,:post用于创建,:删除用于,以及删除。

<%= 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 %>

希望有所帮助!

答案 1 :(得分:2)

原来“破坏”在Rails中有特殊意义。我改为将删除操作重命名为删除,并且工作正常。