модуль ActionController::Redirecting
Публичные методы экземпляров
# File actionpack/lib/action_controller/metal/redirecting.rb, line 69
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(request, options)
self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.unwrapped_html_escape(location)}\">redirected</a>.</body></html>"
end Перенаправляет браузер на целевой адрес, указанный в 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 action: "show", id: 5
redirect_to post
redirect_to "http://www.rubyonrails.org"
redirect_to "/images/screenshot.jpg"
redirect_to articles_url
redirect_to :back
redirect_to proc { edit_post_url(@post) }
Перенаправление происходит как заголовок «302 Found», если не указано иное с помощью параметра :status.
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, если нет referrer, произойдёт исключение ActionController::RedirectBackError. Вы можете указать поведение по умолчанию для этого случая, перехватив исключение ActionController::RedirectBackError.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.