Spec-Zone.ru › Ruby on Rails 4.1

модуль ActionDispatch::Routing::UrlFor

Включенные модули:
ActionDispatch::Routing::PolymorphicRoutes

В config/routes.rb вы определяете сопоставления URL-адресов с контроллерами, но обратное также возможно: URL-адрес можно сгенерировать по одному из ваших маршрутных определений. Функциональность генерации URL-адресов централизована в этом модуле.

См. ActionDispatch::Routing для общей информации о маршрутизации и файле routes.rb.

Совет: Если вам нужно генерировать URL-адреса из ваших моделей или из других мест, тогда вам нужен ActionController::UrlFor. Читайте далее для введения. В общем случае этот модуль не следует включать самостоятельно, так как он обычно включается url_helpers (как в Rails.application.routes.url_helpers).

Генерация URL-адресов из параметров

Как вам известно, некоторые функции, такие как ActionController::Base#url_for и ActionView::Helpers::UrlHelper#link_to, могут генерировать URL-адреса на основе набора параметров. Например, вы, вероятно, имели возможность написать код, подобный этому, в одном из своих представлений:

<%= link_to('Click here', controller: 'users',
        action: 'new', message: 'Welcome!') %>
# => <a href="/users/new?message=Welcome%21">Click here</a>

link_to и все другие функции, требующие функциональности генерации URL-адресов, фактически используют ActionController::UrlFor под капотом. И, в частности, они используют метод ActionController::UrlFor#url_for. Можно сгенерировать тот же путь, что и в примере выше, используя следующий код:

include UrlFor
url_for(controller: 'users',
        action: 'new',
        message: 'Welcome!',
        only_path: true)
# => "/users/new?message=Welcome%21"

Обратите внимание на only_path: true часть. Это связано с тем, что у UrlFor нет информации о имени хоста веб-сайта, на котором работает ваше приложение Rails. Таким образом, если вы хотите включить имя хоста, то вам необходимо также передать :host аргумент:

include UrlFor
url_for(controller: 'users',
        action: 'new',
        message: 'Welcome!',
        host: 'www.example.com')
# => "http://www.example.com/users/new?message=Welcome%21"

По умолчанию все контроллеры и представления имеют доступ к специальной версии #url_for, которая уже знает текущее имя хоста. Поэтому, если вы используете #url_for в своих контроллерах или представлениях, то вам не нужно явно передавать :host аргумент.

Для удобства, почтовые отправления предоставляют сокращение для ActionController::UrlFor#url_for. Поэтому в почтовых отправлениях вам нужно только написать «url_for» вместо «ActionController::UrlFor#url_for» целиком. Однако у почтовых отправлений нет информации о имени хоста, и поэтому вам по-прежнему нужно указать :host аргумент при генерации URL-адресов в почтовых отправлениях.

Генерация URL-адресов для именованных маршрутов

UrlFor также позволяет получить доступ к методам, которые были сгенерированы автоматически из именованных маршрутов. Например, предположим, что у вас есть ресурс «пользователи» в вашей config/routes.rb:

resources :users

Это генерирует, среди прочего, метод users_path. По умолчанию этот метод доступен из ваших контроллеров, представлений и почтовых отправлений. Если вам нужно получить доступ к этому автоматически сгенерированному методу из других мест (например, из модели), вы можете сделать это, включив Rails.application.routes.url_helpers в свой класс:

class User < ActiveRecord::Base
  include Rails.application.routes.url_helpers

  def base_uri
    user_path(self)
  end
end

User.find(1).base_uri # => "/users/1"

Публичные методы класса

new(*) Показать исходный код
Вызывает метод суперкласса
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 102
def initialize(*)
  @_routes = nil
  super
end

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

url_for(options = nil) Показать исходный код

Сгенерировать URL на основе предоставленных параметров, default_url_options и маршрутов, определённых в routes.rb. Поддерживаются следующие параметры:

  • :only_path - Если true, возвращается относительный URL. По умолчанию false.

  • :protocol - Протокол подключения. По умолчанию «http».

  • :host - Указывает хост, на который должен быть направлен ссылка. Если :only_path ложно, этот параметр должен быть указан явно или через default_url_options.

  • :subdomain - Указывает поддомен ссылки, используя tld_length для разделения поддомена и хоста. Если ложно, удаляет все поддомены из части хоста ссылки.

  • :domain - Указывает домен ссылки, используя tld_length для разделения домена и хоста.

  • :tld_length - Количество меток, из которых состоит домен верхнего уровня (TLD), используется только если :subdomain или :domain заданы. По умолчанию ActionDispatch::Http::URL.tld_length, что по умолчанию равно 1.

  • :port - Дополнительно укажите порт для подключения.

  • :anchor - Имя якоря, которое будет добавлено к пути.

  • :trailing_slash - Если true, добавляет конечный слэш, как в «/archive/2009/»

  • :script_name - Указывает путь приложения относительно корня домена. Если указан, добавляет путь приложения в начало.

Любой другой ключ (:controller, :action, и т.д.) предоставленный url_for пересылается модулю Маршрутов.

url_for controller: 'tasks', action: 'testing', host: 'somehost.org', port: '8080'
# => 'http://somehost.org:8080/tasks/testing'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', anchor: 'ok', only_path: true
# => '/tasks/testing#ok'
url_for controller: 'tasks', action: 'testing', trailing_slash: true
# => 'http://somehost.org/tasks/testing/'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', number: '33'
# => 'http://somehost.org/tasks/testing?number=33'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp"
# => 'http://somehost.org/myapp/tasks/testing'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp", only_path: true
# => '/myapp/tasks/testing'
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 150
def url_for(options = nil)
  case options
  when nil
    _routes.url_for(url_options.symbolize_keys)
  when Hash
    _routes.url_for(options.symbolize_keys.reverse_merge!(url_options))
  when String
    options
  when Array
    polymorphic_url(options, options.extract_options!)
  else
    polymorphic_url(options)
  end
end
url_options() Показать исходный код

Переопределённый в контроллере метод для добавления информации о запросе с помощью `default_url_options`. Логика приложения не должна находиться в url_options.

# File actionpack/lib/action_dispatch/routing/url_for.rb, line 110
def url_options
  default_url_options
end

Защищённые методы экземпляра

_routes_context() Показать исходный код
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 179
def _routes_context
  self
end
_with_routes(routes) { || ... } Показать исходный код
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 172
def _with_routes(routes)
  old_routes, @_routes = @_routes, routes
  yield
ensure
  @_routes = old_routes
end
optimize_routes_generation?() Показать исходный код
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 167
def optimize_routes_generation?
  return @_optimized_routes if defined?(@_optimized_routes)
  @_optimized_routes = _routes.optimize_routes_generation? && default_url_options.empty?
end

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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