модуль ActionDispatch::Routing::Mapper::CustomUrls
Публичные методы экземпляра
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2085
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
"http://www.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. Это может быть одно из следующих:
* A string, which is treated as a generated url
* A hash, e.g. { controller: "pages", action: "index" }
* An array, which is passed to `polymorphic_url`
* An Active Model instance
* An Active Model class ПРИМЕЧАНИЕ: В блоке могут вызываться и другие помощники 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 2137
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_for`, когда им передаётся экземпляр модели, например:
resource :basket resolve "Basket" do [:basket] end
Теперь это сгенерирует «/basket», когда экземпляр `Basket` передаётся в `link_to` или `form_for`, вместо стандартного «/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–2018 David Heinemeier Hansson
Licensed under the MIT License.