Spec-Zone.ru › Ruby on Rails 4.1

модуль ActionController::Redirecting

Включенные модули:
ActionController::RackDelegation, ActionController::UrlFor

Общедоступные методы экземпляров

redirect_to(options = {}, response_status = {}) Показать исходный код

Перенаправляет браузер на целевой адрес, указанный в options. Этот параметр может иметь одну из трёх форм:

  • Hash - URL будет сгенерирован вызовом url_for с options.

  • Record - URL будет сгенерирован вызовом url_for с options, который будет ссылаться на именованный URL для этой записи.

  • String начинающийся с protocol:// (например, http://) или относительная ссылка протокола (например, //) - передаётся непосредственно в качестве цели перенаправления.

  • String не содержащий протокол - текущий протокол и хост добавляются к строке.

  • Proc - блок, который будет выполнен в контексте контроллера. Должен вернуть любой параметр, принимаемый redirect_to.

  • :back - назад на страницу, которая инициировала запрос. Полезно для форм, которые запускаются из нескольких мест. Краткая запись для redirect_to(request.env["HTTP_REFERER"])

    #redirect_to действие: “show”, id: 5 #redirect_to post #redirect_to “www.rubyonrails.org” #redirect_to “/images/screenshot.jpg” #redirect_to articles_url #redirect_to :back #redirect_to proc { edit_post_url(@post) }

Перенаправление происходит как заголовок «302 Found», если не указано иное.

redirect_to post_url(@post), status: :found
redirect_to action: 'atom', status: :moved_permanently
redirect_to post_url(@post), status: 301
redirect_to action: 'atom', status: 302

Код состояния может быть стандартным кодом состояния HTTP HTTP Status code в виде целого числа или символом, представляющим пониженное, подчеркнутое и символическое описание. Обратите внимание, что код состояния должен быть кодом HTTP 3xx, в противном случае перенаправления не произойдёт.

Если вы используете запросы XHR, отличные от GET или POST, и перенаправляете после запроса, некоторые браузеры будут следовать перенаправлению с использованием исходного метода запроса. Это может привести к нежелательному поведению, например, к двойному DELETE. Чтобы обойти это, вы можете вернуть код состояния 303 See Other, который будет обработан с использованием GET-запроса.

redirect_to posts_url, status: :see_other
redirect_to action: 'index', status: 303

Также возможно назначить сообщение всплывающей подсказки в рамках перенаправления. Существуют два специальных аксессора для общепринятых имён всплывающих подсказок alert и notice, а также универсальный контейнер flash.

redirect_to post_url(@post), alert: "Watch it, mister!"
redirect_to post_url(@post), status: :found, notice: "Pay attention to the road"
redirect_to post_url(@post), status: 301, flash: { updated_post_id: @post.id }
redirect_to({ action: 'atom' }, alert: "Something serious happened")

При использовании redirect_to :back, если нет реферера, будет возбуждено исключение ActionController::RedirectBackError. Вы можете указать некоторое поведение по умолчанию для этого случая, перехватив исключение ActionController::RedirectBackError.

# File actionpack/lib/action_controller/metal/redirecting.rb, line 65
def redirect_to(options = {}, response_status = {}) #:doc:
  raise ActionControllerError.new("Cannot redirect to nil!") unless options
  raise ActionControllerError.new("Cannot redirect to a parameter hash!") if options.is_a?(ActionController::Parameters)
  raise AbstractController::DoubleRenderError if response_body

  self.status        = _extract_redirect_to_status(options, response_status)
  self.location      = _compute_redirect_to_location(options)
  self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.h(location)}\">redirected</a>.</body></html>"
end

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

Spec-Zone.ru

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