什么是Rails中的嵌套路由?

时间:2014-08-09 14:24:09

标签: ruby-on-rails routing routes nested-routes

我是学习Rails的新手,刚遇到过嵌套路由。我看的例子涉及博客文章和评论。我试图解决嵌套路由在Rails中的好处。

据我所知,/articles/:article_id/comments/:id(.:format)等注释的嵌套路由中包含的所有信息都包含在注释对象本身中,因此它不会向Action传递其他信息。

为什么不使用诸如/comments/:id(.:format)之类的未通行路线?

显然有一个很好的理由使用嵌套路由,但我还没有能够解决它。到目前为止我能看到的唯一好处是它在阅读URL时更好地说明了文章和评论之间的关系,但所有这些信息都包含在评论对象中。

有人可以解释一下吗?

2 个答案:

答案 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了解更多信息