使用关注点时根据父资源设置范围

Set the scope based on parent resource while using concerns

我很好奇,有什么方法可以在 Rails 中使用关注点时基于父资源设置嵌套资源的范围?

concern :commentable do
  scope module: ??? do # either :posts or :messages
    resources :comments
  end
end

resources :messages, concerns: :commentable
resources :posts, concerns: :commentable

我希望我的路线是这样的:

Path                                  Controller
/messages/:message_id/comments/:id    messages/comments#show
/posts/:post_id/comments/:id          posts/comments#show

不过我也想用concerns来减少重复

谢谢!

您可以使用 Rails Polymorphism 来适应这种情况,其中 comment 也可以 belong_to 任何其他模型...post,video, user

精彩Railscasts.......值得一看

原来方法 concerns 可以采用选项的散列。

concern :commentable do |options|
  scope module: options[:module] do
    resources :comments
  end
end

resources :messages do 
  concerns :commentable, module: :messages
end

resources :posts do 
  concerns :commentable, module: :posts
end

我从您的解决方案开始使用选项散列,但事实证明我真的非常需要这种模式,所以我针对该特定情况制定了另一个解决方案:

concern :archivable do
  scope module: parent_resource.plural do
    resources :archiving, only: [:create, :destroy]
  end    
end

...
resources :messages , concerns: [ :archivable ]
resources :users , concerns: [ :archivable ]