1

我有一个“来宾”对象的部分内容,它呈现一个指向破坏操作的链接,如下所示:

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

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

<div id="guests">

<%= 渲染 :partial => @event.guests %>

也就是说,它呈现如下内容:

<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 的新手;)

4

2 回答 2

3

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

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

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

它发出了一个 GET 请求。我假设您的 routes.rb 文件中有类似

地图资源:客人

这会创建大量您可以像这样使用的路线:

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

对于 Rails 中的资源路由,使用的 METHOD 决定了调用的控制器操作。

使用 GET 请求调用的 URL /guests/1 调用 SHOW 操作。您需要在 link_to_remote 调用中指定方法 - :get、:put、:post 或 :delete。: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 %>

希望有帮助!

于 2009-09-13T06:27:46.677 回答
2

原来“destroy”在 Rails 中有特殊的含义。我将销毁操作重命名为删除,它工作正常。

于 2009-09-13T03:05:24.497 回答