Spec-Zone.ru › Ruby on Rails 7.0

модуль 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

Открытые методы экземпляров

concern(name, callable = nil, &block) Показать исходный код
# 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.

concerns(*args) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API