命名路由:为什么destroy_message_path不起作用?

时间:2011-03-17 05:21:26

标签: ruby-on-rails

我有一个像

这样的链接
  <a href = '/messages/destroy/<%= @showmessage.id %>'>Delete Message</a>

我正在将其重写为

  <%= link_to "Delete Message", destroy_message_path(:id => "1") %>

在我的路线中我有

   map.resources :messages, :collection => { :destroy => :get }

在我的控制器中

   def destroy
     @message = Message.find(params[:id])
     @message.destroy
     redirect_to :action => 'index'
   end

当我运行页面时,我收到的错误为:

 undefined method `destroy_message_path' for #<ActionView::Base:0xb24a24c0>

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

我不确定你是不是要在这里与Rails惯例作斗争,但它很容易与它们一起使用,所以如果你对它好,你可以做到以下几点:

从您的路线中删除此内容:

map.resources :messages, :collection => { :destroy => :get }

将其更改为:

map.resources :messages

请改用此链接格式:

<%= link_to "Delete Message", message_path(:id => "1"), :method => 'delete' %>

破坏性操作的URL看起来像/messages/1,但link_to方法的“方法”部分会使Rails创建隐藏的表单并对URL执行模拟的“删除”操作。哪个更加RESTful,并遵循Rails期望你做的事情。

答案 1 :(得分:0)

使用资源,你不应该发出GET请求,你应该发出这样的DELETE请求:

<%= link_to "Delete Message", destroy_message_path(:id => "1"),
            :confirm => 'Are you sure?', :method => :delete %>

并在您的路线文件中:

map.resources :messages

另一方面,您可以将消息的对象传递给destroy_message_path,例如:

<%= link_to "Delete Message", destroy_message_path(@message),
            :confirm => 'Are you sure?', :method => :delete %>