Spec-Zone.ru › Ruby on Rails 5.2

модуль ActionDispatch::Routing::Mapper::Concerns

Маршрутизация Компоненты позволяют объявлять общие маршруты, которые могут быть повторно использованы внутри других ресурсов и маршрутов.

concern :commentable do
  resources :comments
end

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

Эти компоненты используются в маршрутизации Ресурсов:

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 2021
def concern(name, callable = nil, &block)
  callable ||= lambda { |mapper, options| mapper.instance_exec(options, &block) }
  @concerns[name] = callable
end

Определите компонент маршрутизации с помощью имени.

Компоненты могут быть определены внутри, с помощью блока, или обрабатываться другим объектом, передав этот объект в качестве второго параметра.

Объект компонента, если он указан, должен отвечать на 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.

concerns(*args) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2037
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

Используйте именованные компоненты

resources :posts do
  concerns :commentable
end

Компоненты также работают в любом помощнике маршрутов, который вы хотите использовать:

namespace :posts do
  concerns :commentable
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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