модуль ActionDispatch::Routing::Mapper::Base
Открытые методы экземпляра
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 650 def default_url_options=(options) @set.default_url_options = options end
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 662 def has_named_route?(name) @set.named_routes.key?(name) end
Проверяет, был ли уже определён следующий именованный маршрут.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 587 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 — действию контроллера. Шаблон также может сопоставлять сегменты-шаблоны (globs) с параметрами:
get 'songs/*category/:title', to: 'songs#show' # 'songs/rock/classic/stairway-to-heaven' sets # params[:category] = 'rock/classic' # params[:title] = 'stairway-to-heaven'
Чтобы сопоставить параметр-шаблон, ему необходимо присвоить имя. Без имени переменной, к которой можно привязать параметр glob, маршрут невозможно разобрать.
Если шаблон указывает на внутренний маршрут, в параметрах или сокращённой записи хеша должны быть заданы :action и :controller маршрута. Примеры:
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
The `users` resource here will have the following routes generated for it:
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)
You can override `ActiveRecord::Base#to_param` of a related model to
construct a 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
See `Scoping#namespace` for its scope equivalent. - :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
Is equivalent to:
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
See `Scoping#constraints` for more examples with its scope equivalent. - :defaults
-
Задаёт значения параметров по умолчанию.
# Sets params[:format] to 'jpg' by default
match 'path', to: 'c#a', defaults: { format: 'jpg' }, via: :get
See `Scoping#defaults` for its scope equivalent. - :anchor
-
Логическое значение, определяющее, нужно ли привязывать шаблон
match. По умолчанию — true. Если задано false, шаблон соответствует любому запросу, начинающемуся с указанного пути.
# Matches any request starting with 'path'
match 'path', to: 'c#a', anchor: false, via: :get
- :format
-
Позволяет задать значение по умолчанию для необязательного сегмента
formatили отключить его, указавfalse.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 605
def mount(app = nil, deprecated_options = nil, as: DEFAULT, via: nil, at: nil, defaults: nil, constraints: nil, anchor: false, format: false, path: nil, internal: nil, **mapping, &block)
if deprecated_options.is_a?(Hash)
as = assign_deprecated_option(deprecated_options, :as, :mount) if deprecated_options.key?(:as)
via ||= assign_deprecated_option(deprecated_options, :via, :mount)
at ||= assign_deprecated_option(deprecated_options, :at, :mount)
defaults ||= assign_deprecated_option(deprecated_options, :defaults, :mount)
constraints ||= assign_deprecated_option(deprecated_options, :constraints, :mount)
anchor = assign_deprecated_option(deprecated_options, :anchor, :mount) if deprecated_options.key?(:anchor)
format = assign_deprecated_option(deprecated_options, :format, :mount) if deprecated_options.key?(:format)
path ||= assign_deprecated_option(deprecated_options, :path, :mount)
internal ||= assign_deprecated_option(deprecated_options, :internal, :mount)
assign_deprecated_options(deprecated_options, mapping, :mount)
end
path_or_action = at
if app.nil?
hash_app, hash_path = mapping.find { |key, _| key.respond_to?(:call) }
mapping.delete(hash_app) if hash_app
app ||= hash_app
path_or_action ||= hash_path
end
raise ArgumentError, "A rack application must be specified" unless app.respond_to?(:call)
raise ArgumentError, <<~MSG unless path_or_action
Must be called with mount point
mount SomeRackApp, at: "some_route"
or
mount(SomeRackApp => "some_route")
MSG
rails_app = rails_app? app
as = app_name(app, rails_app) if as == DEFAULT
target_as = name_for_action(as, path_or_action)
via ||= :all
match(path_or_action, to: app, as:, via:, defaults:, constraints:, anchor:, format:, path:, internal:, **mapping, &block)
define_generate_prefix(app, target_as) if rails_app
self
end Монтирует приложение на базе Rack для использования внутри приложения.
mount SomeRackApp, at: "some_route"
См. параметры в match, так как mount использует его внутри себя.
Для всех смонтированных приложений создаются вспомогательные методы маршрутизации для доступа к ним. Их имена основаны на указанном классе, поэтому для приведённого выше примера вспомогательный метод будет называться some_rack_app_path или some_rack_app_url. Чтобы изменить имя этого вспомогательного метода, используйте параметр :as:
mount(SomeRackApp, at: "some_route", as: "exciting")
Будут созданы вспомогательные методы exciting_path и exciting_url, с помощью которых можно перейти к этому смонтированному приложению.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 655
def with_default_scope(scope, &block)
scope(**scope) do
instance_exec(&block)
end
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.