我有一个“客人”对象的部分,它提供了一个像这样的销毁动作的链接:
<%= 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的完全新手;)
答案 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中有特殊意义。我改为将删除操作重命名为删除,并且工作正常。