Routing
Concerns
允许您声明可以在其他资源和路由中重复使用的通用路由。
concern :commentable do
resources :comments
end
concern :image_attachable do
resources :images, only: :index
end
这些关注点用于 Resources
路由
resources :messages, concerns: [:commentable, :image_attachable]
或在范围或命名空间中
namespace :posts do
concerns :commentable
end
方法
实例公共方法
concern(name, callable = nil, &block) 链接
使用名称定义路由关注点。
Concerns
可以使用块内联定义,也可以使用另一个对象处理,方法是将该对象作为第二个参数传递。
如果提供了关注点对象,它应该响应 call
,它将接收两个参数
* The current mapper
* A hash of options which the concern object may use
关注点在块中定义时也可以使用选项,方法是接受块参数。因此,使用块,您可以执行一些简单的操作,例如限制某些资源上可用的操作,通过关注点传递标准资源选项
concern :commentable do |options|
resources :comments, options
end
resources :posts, concerns: :commentable
resources :archived_posts do
# Don't allow comments on archived posts
concerns :commentable, only: [:index, :show]
end
或者,使用可调用对象,您可以在应用程序中实现更具体的东西,这在您的路由文件中是不合适的。
# purchasable.rb
class Purchasable
def initialize(defaults = {})
@defaults = defaults
end
def call(mapper, options = {})
options = @defaults.merge(options)
mapper.resources :purchases
mapper.resources :receipts
mapper.resources :returns if options[:returnable]
end
end
# routes.rb
concern :purchasable, Purchasable.new(returnable: true)
resources :toys, concerns: :purchasable
resources :electronics, concerns: :purchasable
resources :pets do
concerns :purchasable, returnable: false
end
任何路由帮助程序都可以在关注点内使用。如果使用可调用对象,则可以从传递给 call
的 Mapper
中访问它们。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2145 def concern(name, callable = nil, &block) callable ||= lambda { |mapper, options| mapper.instance_exec(options, &block) } @concerns[name] = callable end
concerns(*args) 链接
使用命名的关注点
resources :posts do
concerns :commentable
end
Concerns
也可以在您想使用的任何路由帮助程序中使用
namespace :posts do
concerns :commentable
end
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2161 def concerns(*args) options = args.extract_options! args.flatten.each do |name| if concern = @concerns[name] concern.call(self, options) else raise ArgumentError, "No concern named #{name} was found!" end end end