Rails中嵌套路由是什么?

3
我刚开始学习Rails并遇到了嵌套路由。我看的例子涉及博客文章和评论。我试图理解在Rails中使用嵌套路由的好处。
据我所知,评论的嵌套路由中包含的所有信息,例如`/articles/:article_id/comments/:id(.:format)`,都包含在评论对象本身中,因此它不会向Action传递额外的信息。
为什么不只使用非嵌套路由,如`/comments/:id(.:format)`?
显然,使用嵌套路由有非常好的原因,但我还没有能够理解它。到目前为止,我唯一看到的好处是当阅读URL时,它可以更好地说明文章和评论之间的关系,但是所有这些信息都已包含在评论对象中。
有人能解释一下吗?
2个回答

5
在您的模型中,您应该设置这个关联。
class Article< ActiveRecord::Base
  has_many :comments
end

class Comment< ActiveRecord::Base
  belongs_to :article
end

每个评论都与一篇文章相关联,您需要一些逻辑来查找评论对应的文章。 这就是嵌套路由的作用,在控制器操作中使用它可以让您找到该评论所属的文章。如果您再次查看该路由,则会发现。
/articles/:article_id/comments/:id(.:format)

这是评论控制器的展示操作,此路由允许您在展示操作中查找文章和您的评论。
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

请查看嵌套路由以获取更多信息。


2

正确的做法是,当处理已存在的comment(因为你可以从comment中获取article)时,将article包含在路径中会显得多余。为了避免这种情况,您可以使用shallow路由:

#routes.rb

resources :articles, shallow: true do
  resources :comments
end

# or use a `shallow` block
shallow do
  resources :articles
    resources :comments
  end
end

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