Rails:嵌套路径视图约定

时间:2017-06-20 00:15:04

标签: ruby-on-rails

我正在阅读Rails "Getting Started"指南,并注意到用于确定链接路径的代码中的一个有趣区别。 对于父模型article,我们有:

<%= link_to 'Destroy', article_path(article), 
  method: :delete, data: { confirm: 'Are you sure?' } %>

对于儿童模型comment,我们有:

<%= link_to 'Destroy Comment', [comment.article, comment],
 method: :delete, data: { confirm: 'Are you sure?' } %>

这些似乎是在类似情况下链接到模型的非常不同的格式。是否有解释 - 技术或方法相关?我特别好奇为什么comment需要2个项目的数组。

最后,我的继承直觉告诉我代码应该是article.comment而不是comment.article。这种排序背后的任何推理?

2 个答案:

答案 0 :(得分:2)

在指南的前面,您可以看到他们在文章和评论之间建立了一些关联。一篇文章有​​很多评论,评论属于一篇文章。

有一个删除评论数组的原因是因为你必须知道评论所属的文章和评论本身,因为这些关联。由于评论属于文章,我们需要文章ID来查找我们要删除的评论。这就是为什么它的评论。文章。我们正在查找评论所属的文章。

如果您撰写article.comment,您将收到该文章的评论,而不是评论的文章。

答案 1 :(得分:2)

添加到 @hashrocket 回答,这完全取决于Rails如何为嵌套资源创建路由。如果运行rake routes,您会看到此

article         DELETE /articles/:id(.:format)   articles#destroy

article_comment DELETE /articles/:article_id/comments/:id(.:format) comments#destroy

这意味着,文章的删除请求只需将:id作为键/参数,而删除评论请求需要两个< / em>,article_id特定评论所属文章的:id )和评论本身的:id

简单来说,要删除文章,您只需要:id,因此它是article_path(article),而要删除评论则需要:id(适用于{{1}它所属的文章和评论的:article_id,所以它是:id。您也可以将其写为[comment.article, comment]

我建议你阅读nested resources以便更好地理解