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

问题描述:

我有喜欢命名路由:为什么destroy_message_path不起作用?

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

如何解决此问题?

我不知道,如果你的意思是在这里对抗Rails惯例,但其容易得多跟他们一起去,所以如果您没有问题,你可以做到以下几点:

删除此从您的路线:

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

将其更改为:

map.resources :messages 

,并使用该链接的格式,而不是:

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

破坏性操作的URL看起来像/messages/1,但该方法的“方法”部分将使Rails创建一个隐藏表单并对该URL执行模拟的“DELETE”操作。这更加RESTful,并且跟随Rails期待你做的事情。

+0

非常感谢.. – useranon 2011-03-17 05:36:58

有了资源,你不应该做一个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 %>