ruby-on-rails Rails中嵌套资源的意义是什么?

huus2vyu  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(134)

假设我有一个Rails中的原型博客应用程序。我会有一个有很多评论的帖子模型。我的routes.rb可能看起来像这样:

resources :post do
    resources :comment
end

这意味着例如注解的编辑路径看起来像这样:/post/21/comment/42/edit.当我们在两个模型之间有一个has many/belongs to关系时,这似乎是有意义的。然而,一旦你注意到帖子的id并不是真正需要找到评论(甚至是帖子)的,它就开始变得不那么有意义了。
为了理解我的意思,考虑控制器中编辑操作的两个等价实现:

# Nested resource version
def edit
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    # ...
end

vs.

# Un-nested resource version
def edit
    @comment = Comment.find(params[:id])
    @post = @comment.post
    # ...
end

我的问题是:是否有我没有考虑过的用例?或者嵌套资源只适合制作漂亮的URL?

vbkedwbf

vbkedwbf1#

在这里提出我自己的问题。
是的,在某些情况下是有意义的:

  • 与问题中的假设相反,评论的id不足以找到它所属的帖子。评论的id只能是 * 复合主键 * 的一个组成部分,而文章的id是另一个组成部分。
  • 假设用户输入了错误的评论ID,或者更常见的情况是,用户跟随一个链接到一个已被删除的评论。如果帖子的id出现在URL中,则应用程序可以选择向用户呈现比一般的404页面更有用的响应,例如显示所有帖子评论的索引,并带有消息说用户请求的特定评论不存在。
  • RESTful URL的约定是,如果用户从URL中删除了注解ID,则应该向他们提供索引页面。如果评论是文章的子资源,这个索引页面应该只包含属于同一篇文章的评论,但是如果URL中没有文章id,这将是不可能的。

相关问题