модуль ActionDispatch::Routing::Mapper::Base
Методы экземпляра публичного интерфейса
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 618 def default_url_options=(options) @set.default_url_options = options end
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 630 def has_named_route?(name) @set.named_routes.key?(name) end
Проверить, была ли уже определена следующая именованная маршрутизация.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 566 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 маршрута должны быть заданы в параметрах options или краткой форме хэша. Примеры:
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.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 588
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, options.merge(to: app, anchor: false, format: false))
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, которые можно использовать для перехода к этому подключённому приложению.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 623
def with_default_scope(scope, &block)
scope(scope) do
instance_exec(&block)
end
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.