在我的应用程序中,用户可以发布帖子,用户可以在其他用户的帖子上进行更正(将其视为评论)。每个用户可以有很多帖子,每个帖子可以有很多更正。
在帖子的每个节目页面上,都有一个表单来创建新的更正。这使用user_post_corrections
路径。
在每个用户的显示页面上,我想显示他们为任何帖子提交的每个更正。这需要user_corrections
路径。
为了达到这个目的,我在routes.rb中有以下内容:
resources :users do
resources :posts do
resources :corrections
end
end
resources :users do
resources :corrections
end
这对我来说直觉感觉很糟糕,因为我创建了两个彼此非常相似的嵌套路线。
有更好的方法吗?我的代码工作正常,但是有没有最佳实践方法来实现这种模型?
答案 0 :(得分:1)
Routing concerns是一种优秀但未被充分利用的工具,用于干燥您的路线:
concern :correctable do
resources :corrections
end
# just an example of multiple concerns
concern :commentable do
resources :comments
end
resources :users, concerns: :correctable
resources :posts, concerns: [:correctable, :commentable]
但是在创建嵌套路由时应该采取这样做,这样就不会不必要地嵌套。
通常,您可能希望集体操作[new, index, create]
由父级确定:
GET|POST /posts/:post_id/corrections
GET /posts/:post_id/corrections/new
虽然您希望成员操作不受范围限制,因为如果记录具有唯一ID,您可以直接访问记录。
GET /corrections/:id
GET /corrections/:id/edit
PATCH /corrections/:id
DELETE /corrections/:id
要做到这一点,你会声明路线如下:
resources :corrections, only: [:show, :update, :edit]
concern :correctable do
resources :corrections, only: [:new, :index, :create]
end
resources :users, :posts, concerns: [:correctable]
shallow: true
选项会执行类似这样的操作,但是当您为每次调用添加未编组路由时多次声明相同resources
时效果不佳。