rails - 创建类似路线的最佳做法?

时间:2016-04-16 17:13:23

标签: ruby-on-rails

在我的应用程序中,用户可以发布帖子,用户可以在其他用户的帖子上进行更正(将其视为评论)。每个用户可以有很多帖子,每个帖子可以有很多更正。

在帖子的每个节目页面上,都有一个表单来创建新的更正。这使用user_post_corrections路径。

在每个用户的显示页面上,我想显示他们为任何帖子提交的每个更正。这需要user_corrections路径。

为了达到这个目的,我在routes.rb中有以下内容:

resources :users do
    resources :posts do
      resources :corrections
      end
    end

    resources :users do
      resources :corrections
    end

这对我来说直觉感觉很糟糕,因为我创建了两个彼此非常相似的嵌套路线。

有更好的方法吗?我的代码工作正常,但是有没有最佳实践方法来实现这种模型?

1 个答案:

答案 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时效果不佳。