命名路由:为什么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期待你做的事情。
答
有了资源,你不应该做一个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 %>
非常感谢.. – useranon 2011-03-17 05:36:58