我是学习Rails的新手,刚遇到过嵌套路由。我看的例子涉及博客文章和评论。我试图解决嵌套路由在Rails中的好处。
据我所知,/articles/:article_id/comments/:id(.:format)
等注释的嵌套路由中包含的所有信息都包含在注释对象本身中,因此它不会向Action传递其他信息。
为什么不使用诸如/comments/:id(.:format)
之类的未通行路线?
显然有一个很好的理由使用嵌套路由,但我还没有能够解决它。到目前为止我能看到的唯一好处是它在阅读URL时更好地说明了文章和评论之间的关系,但所有这些信息都包含在评论对象中。
有人可以解释一下吗?
答案 0 :(得分:2)
正确,在处理预先存在的article
时,路径中comment
是多余的(因为您可以从article
获取comment
)。为避免这种情况,您可以使用shallow
路由:
#routes.rb
resources :articles, shallow: true do
resources :comments
end
# or use a `shallow` block
shallow do
resources :articles
resources :comments
end
end
答案 1 :(得分:1)
在您的模型中,您可以设置此关联
class Article< ActiveRecord::Base
has_many :comments
end
class Comment< ActiveRecord::Base
belongs_to :article
end
所以每条评论都与文章相关联,您需要一些逻辑来查找相应的评论文章
这是嵌套路由的来源,可让您在控制器操作中找到该评论的文章。如果再次查看该路线
/articles/:article_id/comments/:id(.:format)
这是评论控制器显示操作,此路线允许您在show action
中查找文章和评论def show
@article = Article.find(params[:article_id])
@comment = Comment.find(params[:id])
# if you are not using nested routes then you can find out associated article by
@article = @comment.article # but you'll have to query your database to get it which you can simply find if you are using nested route
end
不仅仅是show动作(您可以使用其他逻辑来查找与该评论相关联的文章)您需要针对新动作的嵌套路线,您必须找到该文章,然后构建评论对于那篇 的文章
def new
@article = Article.new
@comment = @article.comments.build
end
正如@August
指出的那样,您可以通过使用浅嵌套来分离您希望路由嵌套的操作,您可以这样做:
resources :articles do
resources :comments, shallow: true
end
结帐nested routes
了解更多信息