我有一个像
这样的链接 <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>
如何解决此问题?
答案 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 %>