Concerns

重复使用已经定义的路由,避免 config/routes.rb 里出现重复代码,和生成路由规则没有直接联系。

举例(使用 concern & concerns 之前):

AppName::Application.routes.draw do
  resources :messages do
    resources :comments
    resources :categories
    resources :tags
  end

  resources :posts do
    resources :comments
    resources :categories
    resources :tags
  end

  # ...
end

举例(使用 concern & concerns 之后):

AppName::Application.routes.draw do
  concern :sociable do
    resources :comments
    resources :categories
    resources :tags
  end

  resources :messages do
    concerns :sociable
  end

  resources :posts do
    concerns :sociable
  end

  # ...
end

再次举例:

concern :commentable do
  resources :comments
end

concern :image_attachable do
  resources :images, only: :index
end

# concerns 可以跟多个 concern
resources :messages, concerns: [:commentable, :image_attachable]

namespace :posts do
  concerns :commentable
end

一些疑问?

即使是去除重复代码,也还有其它方法实现。如:

AppName::Application.routes.draw do
  def add_posts
    resources :posts, :only => [:create, :destroy]
  end

  resources :events do
    add_posts
  end
end

有必要使用 DSL 吗?

讨论 里 dhh 回答了此问题。

最后更新于