модуль ActionDispatch::Routing::Mapper::Concerns
Routing Concerns позволяют объявлять общие маршруты, которые могут быть повторно использованы внутри других ресурсов и маршрутов.
concern :commentable do resources :comments end concern :image_attachable do resources :images, only: :index end
Эти concern используются в маршрутизации Resources:
resources :messages, concerns: [:commentable, :image_attachable]
или в области или пространстве имен:
namespace :posts do concerns :commentable end
Открытые методы экземпляров
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2048
def concern(name, callable = nil, &block)
callable ||= lambda { |mapper, options| mapper.instance_exec(options, &block) }
@concerns[name] = callable
end Определите concern маршрута, используя имя.
Concerns может быть определён внутри, используя блок, или обработан другим объектом, передав этот объект как второй параметр.
Объект concern, если он предоставлен, должен отвечать на call, который получит два параметра:
* The current mapper * A hash of options which the concern object may use
Опции также могут использоваться concern, определёнными в блоке, принимая параметр блока. Таким образом, используя блок, вы можете сделать что-то настолько простое, как ограничить доступные действия для определённых ресурсов, передавая стандартные параметры ресурса через concern:
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
Любые вспомогательные функции маршрутизации могут использоваться внутри concern. Если используется вызываемый объект, они доступны из Mapper, который передаётся в call.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2064
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 Используйте именованные concern
resources :posts do concerns :commentable end
Concerns также работают в любом вспомогательном методе маршрута, который вы хотите использовать:
namespace :posts do concerns :commentable end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.