Spec-Zone.ru › Ruby on Rails 6.0

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

Публичные методы экземпляра

direct(name, options = {}, &block) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2119
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. Это может быть одно из следующих:

  • Строка, которая обрабатывается как сгенерированный 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, и он вызовет ошибку, если обнаружит, что он находится в нём.

resolve(*args, &block) Показать исходный код
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2171
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 в link_to или form_for будет генерироваться «/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–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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