module ActionDispatch::Routing::Mapper::CustomUrls
Открытые методы экземпляра
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2374
def direct(name, options = {}, &block)
unless @scope.root?
raise RuntimeError, "The direct method can't be used inside a routes scope block"
end
@set.add_url_helper(name, options, &block)
end Определяет пользовательские URL-хелперы, которые будут добавлены к маршрутам приложения. Это позволяет переопределять и/или заменять поведение маршрутизирующих хелперов по умолчанию, например:
direct :homepage do
"https://rubyonrails.org"
end
direct :commentable do |model|
[ model, anchor: model.dom_id ]
end
direct :main do
{ controller: "pages", action: "index", subdomain: "www" }
end
Возвращаемое значение блока, переданного в direct, должно быть допустимым набором аргументов для url_for, который фактически сформирует строку URL. Это может быть одно из следующего:
-
Строка, которая рассматривается как сгенерированный URL
-
Хеш, например
{ controller: "pages", action: "index" } -
Массив, который передаётся в
polymorphic_url -
Экземпляр Active Model
-
Класс Active Model
ПРИМЕЧАНИЕ: В блоке можно вызывать другие URL-хелперы, но будьте осторожны и не вызывайте повторно свой пользовательский URL-хелпер, иначе это приведёт к переполнению стека.
Также можно указать параметры по умолчанию, которые будут переданы в определение вашего URL-хелпера, например:
direct :browse, page: 1, size: 10 do |options| [ :products, options.merge(params.permit(:page, :size).to_h.symbolize_keys) ] end
В этом случае объект params берётся из контекста, в котором выполняется блок, например при генерации URL внутри действия контроллера или представления. Если блок выполняется там, где нет объекта params, например:
Rails.application.routes.url_helpers.browse_path
то будет вызвана ошибка NameError. Поэтому при определении пользовательского URL-хелпера необходимо учитывать контекст, в котором он будет использоваться.
ПРИМЕЧАНИЕ: Метод direct нельзя использовать внутри блока области действия, например namespace или scope; если метод обнаружит такое использование, он вызовет ошибку.
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2426
def resolve(*args, &block)
unless @scope.root?
raise RuntimeError, "The resolve method can't be used inside a routes scope block"
end
options = args.extract_options!
args = args.flatten(1)
args.each do |klass|
@set.add_polymorphic_mapping(klass, options, &block)
end
end Определяет пользовательские полиморфные соответствия моделей URL-адресам. Это изменяет поведение polymorphic_url и, следовательно, поведение link_to, form_with и form_for при передаче им экземпляра модели, например:
resource :basket resolve "Basket" do [:basket] end
Теперь при передаче экземпляра Basket в link_to, form_with или form_for будет сгенерирован URL «/basket» вместо стандартного «/baskets/:id».
ПРИМЕЧАНИЕ: Это пользовательское поведение применяется только к простым полиморфным URL, которым передаётся один экземпляр модели, но не к более сложным формам, например:
# config/routes.rb
resource :profile
namespace :admin do
resources :users
end
resolve("User") { [:profile] }
# app/views/application/_menu.html.erb
link_to "Profile", @current_user
link_to "Profile", [:admin, @current_user]
Первый link_to сгенерирует «/profile», а второй — стандартный полиморфный URL «/admin/users/1».
В полиморфное соответствие можно передать параметры — блок должен принимать два аргумента, так как экземпляр передаётся первым аргументом, например:
resolve "Basket", anchor: "items" do |basket, options| [:basket, options] end
В результате будет сгенерирован URL «/basket#items», поскольку последний элемент массива, переданного в polymorphic_url, является хешем и поэтому рассматривается как параметры для вызываемого URL-хелпера.
ПРИМЕЧАНИЕ: Метод resolve нельзя использовать внутри блока области действия, например namespace или scope; если метод обнаружит такое использование, он вызовет ошибку.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.