Spec-Zone.ru › Ruby on Rails 7.1

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

Общедоступные методы экземпляра

default_url_options(options)
Псевдоним для: default_url_options=
default_url_options=(options) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 630
def default_url_options=(options)
  @set.default_url_options = options
end
Также используется как: default_url_options
has_named_route?(name) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 642
def has_named_route?(name)
  @set.named_routes.key?(name)
end

Проверить, определён ли следующий именованный маршрут.

match(path, options = nil) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 578
def match(path, options = nil)
end

Сопоставляет шаблон URL с одним или несколькими маршрутами.

Вы не должны использовать метод match в своём маршрутизаторе без указания HTTP-метода.

Если вы хотите предоставить доступ к своему действию как для GET, так и для POST, используйте:

# sets :controller, :action, and :id in params
match ':controller/:action/:id', via: [:get, :post]

Обратите внимание, что :controller, :action, и :id интерпретируются как параметры запроса URL и, следовательно, доступны через params в действии.

Если вы хотите предоставить доступ к своему действию для GET, используйте get в маршрутизаторе:

Вместо:

match ":controller/:action/:id"

Делайте так:

get ":controller/:action/:id"

Два из этих символов являются специальными: :controller отображается на контроллер, а :action на действие контроллера. Шаблон также может сопоставлять сегменты с подстановкой (шаблоны) с параметрами:

get 'songs/*category/:title', to: 'songs#show'

# 'songs/rock/classic/stairway-to-heaven' sets
#  params[:category] = 'rock/classic'
#  params[:title] = 'stairway-to-heaven'

Для сопоставления параметра с подстановкой ему необходимо присвоить имя. Без имени переменной для привязки параметра с подстановкой маршрут не может быть проанализирован.

Когда шаблон указывает на внутренний маршрут, :action и :controller маршрута должны быть установлены в параметрах или с помощью сокращённой записи. Примеры:

match 'photos/:id' => 'photos#show', via: :get
match 'photos/:id', to: 'photos#show', via: :get
match 'photos/:id', controller: 'photos', action: 'show', via: :get

Шаблон также может указывать на конечную точку Rack (например, любой объект, который отвечает на call):

match 'photos/:id', to: -> (hash) { [200, {}, ["Coming soon"]] }, via: :get
match 'photos/:id', to: PhotoRackApp, via: :get
# Yes, controller actions are just rack endpoints
match 'photos/:id', to: PhotosController.action(:show), via: :get

Поскольку запросы с различными HTTP-методами к одному действию имеют последствия для безопасности, вы должны либо указать действия в параметре via, либо использовать один из HttpHelpers вместо match

Параметры

Любые параметры, не указанные здесь, передаются в качестве параметров с URL.

:controller

Контроллер маршрута.

:action

Действие маршрута.

:param

Переопределяет идентификатор ресурса по умолчанию :id (имя динамического сегмента, используемого для генерации маршрутов). Вы можете получить доступ к этому сегменту в своём контроллере с помощью params[<:param>]. В вашем маршрутизаторе:

resources :users, param: :name

У ресурса users здесь будут сгенерированы следующие маршруты:

GET       /users(.:format)
POST      /users(.:format)
GET       /users/new(.:format)
GET       /users/:name/edit(.:format)
GET       /users/:name(.:format)
PATCH/PUT /users/:name(.:format)
DELETE    /users/:name(.:format)

Вы можете переопределить ActiveRecord::Base#to_param связанной модели для построения URL:

class User < ActiveRecord::Base
  def to_param
    name
  end
end

user = User.find_by(name: 'Phusion')
user_path(user)  # => "/users/Phusion"
:path

Префикс пути для маршрутов.

:module

Пространство имён для :controller.

match 'path', to: 'c#a', module: 'sekret', controller: 'posts', via: :get
# => Sekret::PostsController

См. Scoping#namespace для эквивалентного варианта в области видимости.

:as

Имя, используемое для генерации помощников маршрутизации.

:via

Разрешённые HTTP-методы для маршрута.

match 'path', to: 'c#a', via: :get
match 'path', to: 'c#a', via: [:get, :post]
match 'path', to: 'c#a', via: :all
:to

Указывает на конечную точку Rack. Может быть объектом, который отвечает на call, или строкой, представляющей действие контроллера.

match 'path', to: 'controller#action', via: :get
match 'path', to: -> (env) { [200, {}, ["Success!"]] }, via: :get
match 'path', to: RackApp, via: :get
:on

Сокращение для обертывания маршрутов в определённый контекст REST. Допустимые значения — :member, :collection, и :new. Используйте только в блоке resource(s). Например:

resource :bar do
  match 'foo', to: 'c#a', on: :member, via: [:get, :post]
end

Эквивалентно:

resource :bar do
  member do
    match 'foo', to: 'c#a', via: [:get, :post]
  end
end
:constraints

Ограничивает параметры с помощью хэша регулярных выражений или объекта, который отвечает на matches?. Кроме того, ограничения, отличные от пути, также могут быть указаны с помощью любого объекта, который отвечает на === (например, String, Array, Range и т.д.).

match 'path/:id', constraints: { id: /[A-Z]\d{5}/ }, via: :get

match 'json_only', constraints: { format: 'json' }, via: :get

class PermitList
  def matches?(request) request.remote_ip == '1.2.3.4' end
end
match 'path', to: 'c#a', constraints: PermitList.new, via: :get

См. Scoping#constraints для получения дополнительных примеров с эквивалентом в области видимости.

:defaults

Устанавливает значения параметров по умолчанию

# Sets params[:format] to 'jpg' by default
match 'path', to: 'c#a', defaults: { format: 'jpg' }, via: :get

См. Scoping#defaults для эквивалентного варианта в области видимости.

:anchor

Булево значение для привязки шаблона match. По умолчанию true. Если установлено в false, шаблон соответствует любому запросу, начинающемуся с заданного пути.

# Matches any request starting with 'path'
match 'path', to: 'c#a', anchor: false, via: :get
:format

Позволяет указать значение по умолчанию для необязательного сегмента format или отключить его, указав false.

mount(app, options = nil) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 600
        def mount(app, options = nil)
          if options
            path = options.delete(:at)
          elsif Hash === app
            options = app
            app, path = options.find { |k, _| k.respond_to?(:call) }
            options.delete(app) if app
          end

          raise ArgumentError, "A rack application must be specified" unless app.respond_to?(:call)
          raise ArgumentError, <<~MSG unless path
            Must be called with mount point

              mount SomeRackApp, at: "some_route"
              or
              mount(SomeRackApp => "some_route")
          MSG

          rails_app = rails_app? app
          options[:as] ||= app_name(app, rails_app)

          target_as       = name_for_action(options[:as], path)
          options[:via] ||= :all

          match(path, { to: app, anchor: false, format: false }.merge(options))

          define_generate_prefix(app, target_as) if rails_app
          self
        end

Подключить приложение на основе Rack, которое будет использоваться внутри приложения.

mount SomeRackApp, at: "some_route"

В качестве альтернативы:

mount(SomeRackApp => "some_route")

Для параметров см. match, так как mount использует его внутри.

Все подключенные приложения поставляются с помощниками маршрутизации для доступа к ним. Они названы по имени указанного класса, поэтому для приведенного выше примера помощник называется либо some_rack_app_path или some_rack_app_url. Чтобы настроить имя этого помощника, используйте параметр :as:

mount(SomeRackApp => "some_route", as: "exciting")

Это сгенерирует помощников exciting_path и exciting_url, которые могут использоваться для перехода к этому подключённому приложению.

with_default_scope(scope, &block) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 635
def with_default_scope(scope, &block)
  scope(scope) do
    instance_exec(&block)
  end
end

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

Spec-Zone.ru

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