Rails如何使用link_to删除嵌套资源?

16

我有一个嵌套资源attachments,我想创建一个link_to来删除该附件。这是我的代码,但它以GET方式进行提交而不是PUT:

<%= link_to "Delete Attachment", project_thread_attachment_path(@attachment.thread.project.id, @attachment.thread.id, @attachment.id), :confirm => "Are you sure you want to delete this attachment?", :method => :delete, :action => "destroy" %>

有什么想法?谢谢!

2个回答

16

请尝试

link_to "Delete Attachment", [@attachment.thread.project,@attachment.thread,@attachment], :confirm => "Are you sure?", :method => :delete

它有效吗?


2
这对我很有帮助,你能解释一下为什么吗?为什么要用括号而不是foo_path(parent_of_foo, foo)? - TJ Sherrill
2
@TJSherrill 方括号是嵌套记录的数组,然后Rails会“处理”这个数组,根据你的路由计算所有给定嵌套记录的路径。在这种情况下,数组的第一个元素是Project,第二个是Thread,第三个是Attachment。Rails“猜测”Attachment属于Thread,而Thread属于Project,使用这些嵌套记录计算路径:project,然后是thread,最后是attachment,这导致了helper:project_thread_attachment_path - MrYoshiji
@MrYoshiji: 我曾经让这个解决方案工作过,但后来在路由中添加了一个名称为":as"的范围,设置为 "admin",所以路径现在有一个前缀叫做 "admin_ "。现在路径生成器不再起作用了。我该怎么修改才能将这个解决方案添加到范围中呢? - Michael L.
1
我自己找到了答案: 我只需要将:admin符号添加到数组中作为第一个条目,就像这样: [:admin,@attachment.thread.project,@attachment.thread,@attachment] - Michael L.

9

您应该只使用以下内容(删除 :action => 'destroy' 部分)。此外,请求应该是一个 DELETE 请求,而不是 PUT 请求:

<%= link_to "删除附件", project_thread_attachment_path(@attachment.thread.project.id, @attachment.thread.id, @attachment.id), :confirm => "您确定要删除此附件吗?", :method => :delete %>

谢谢,但我刚刚检查了日志,它仍在执行GET请求。 - AnApprentice
1
这很奇怪。你尝试过交换:method和:confirm吗?它出现在哪个日志中,作为GET请求?你是否看到调用中有一个名为_method的参数? - Pan Thomakos
@Pan Thomakos,是的,像Gerry的答案中那样将参数放在数组中和将它们放在原始逗号分隔的参数列表中有什么区别? - ahnbizcad
一个逗号分隔的列表,例如 function(a,b,c),会将3个参数abc传递给function函数。而一个数组,例如function([a,b,c]),只会将1个参数,即数组[a,b,c]传递给function函数。 - Pan Thomakos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接