Rails - 无法弄清楚如何销毁记录

时间:2011-02-03 03:50:01

标签: ruby-on-rails routes link-to

我无法找到销毁记录的正确方法。我觉得这样一个完整的新手。

以下是与控制器有关的路由(来自rake routes的输出):

    contents GET    /admin/contents(.:format)                   {:controller=>"contents", :action=>"index"}
    contents POST   /admin/contents(.:format)                   {:controller=>"contents", :action=>"create"}
 new_content GET    /admin/contents/new(.:format)               {:controller=>"contents", :action=>"new"}
edit_content GET    /admin/contents/:id/edit(.:format)          {:controller=>"contents", :action=>"edit"}
     content GET    /admin/contents/:id(.:format)               {:controller=>"contents", :action=>"show"}
     content PUT    /admin/contents/:id(.:format)               {:controller=>"contents", :action=>"update"}
     content DELETE /admin/contents/:id(.:format)               {:controller=>"contents", :action=>"destroy"}

得到我的是底线与获取和放置没有任何不同。

这是链接:

<%= link_to 'Destroy', content, :confirm => 'Are you sure?', :method => :delete %>

也尝试过:

<%= link_to 'Destroy', content, :confirm => 'Are you sure?', :method => :destroy %>

,输出为:

<a href="/admin/contents/1400" data-confirm="Are you sure?" data-method="destroy" rel="nofollow">Destroy</a>

有人能发现我在做错了吗? : - /


修改

我最初没有加载rails.js。我现在做。

以下是我的销毁行动的内容:

def destroy
  @content = Content.find(params[:id])
  @content.destroy

  respond_to do |format|
    format.html { redirect_to(contents_url) }
    format.xml  { head :ok }
  end
end

我正在删除内容索引,如下所示:

<% @contents.each do |content| %>
  <tr>
    <td><%= content.name %></td>
    <td><%= link_to 'Show', content %></td>
    <td><%= link_to 'Edit', edit_content_path(content) %></td>
    <td><%= link_to 'Destroy', content, :confirm => 'Are you sure?', :method => :destroy %></td>
  </tr>
<% end %>
</table>

2 个答案:

答案 0 :(得分:4)

URL看起来是一样的,因为它是相同的。区别在于request method。您的Rails应用知道将GETPUTDELETE请求分开 - 即使它们是针对相同的网址 - 并将请求路由到正确的操作。

然而,并非所有浏览器/网络服务器都支持所有这些方法,因此Rails依靠不引人注目的JavaScript(ujs)来“伪造”某些请求 - 更具体地说,PUTDELETE 。因此,您需要为Rails应用程序包含一个捆绑包(Prototype默认出现;您可以获得jQuery versionthis gem)。您可以通过jQuery ujs的README(当然还有源代码)了解更多信息。

如果您遇到问题,可能是因为您没有必要的ujs。也可能是您未在html标题中包含csrf_meta_tag

答案 1 :(得分:2)

有些事情可能会出错,但如果没有更多关于你所拥有的信息以及你所得到的错误/行为,就很难缩小范围。

  1. 您没有加载rails.js,因此data-method="delete"无法发送一个_method参数设置为“delete”的AJAX帖子。
  2. 您的destroy控制器操作没有按照您的预期进行操作。
  3. content不是指向您要销毁的模型实例的局部变量(请注意,如果这是您试图销毁的单一资源,则只会使用单数content_path )。您是否正在寻找@content?没有一些背景,很难说。
  4. 只是为了澄清一下,method选项是HTTP方法,而不是控制器方法。没有destroy HTTP方法; Rails只使用destroy而非delete作为“优雅删除”。