модуль ActionController::Redirecting
Публичные методы экземпляров
# File actionpack/lib/action_controller/metal/redirecting.rb, line 90 def redirect_back(fallback_location:, allow_other_host: true, **args) referer = request.headers["Referer"] redirect_to_referer = referer && (allow_other_host || _url_host_allowed?(referer)) redirect_to redirect_to_referer ? referer : fallback_location, **args end
Перенаправляет браузер на страницу, которая инициировала запрос (ссылка-источник), если это возможно, иначе перенаправляет на указанную по умолчанию страницу.
Информация о ссылке-источнике извлекается из HTTP Referer (sic) заголовка запроса. Этот заголовок является необязательным и его присутствие зависит от настроек безопасности браузера и предпочтений пользователя. Если этого заголовка нет, будет использована fallback_location.
redirect_back fallback_location: { action: "show", id: 5 }
redirect_back fallback_location: @post
redirect_back fallback_location: "http://www.rubyonrails.org"
redirect_back fallback_location: "/images/screenshot.jpg"
redirect_back fallback_location: posts_url
redirect_back fallback_location: proc { edit_post_url(@post) }
redirect_back fallback_location: '/', allow_other_host: false
Параметры
-
:fallback_location- Страница по умолчанию, которая будет использована при отсутствии заголовкаReferer. -
:allow_other_host- Разрешить или запретить перенаправление на хост, отличающийся от текущего, по умолчанию значение true.
Все остальные параметры, которые можно передать в redirect_to, принимаются как параметры, и поведение идентично.
# File actionpack/lib/action_controller/metal/redirecting.rb, line 58
def redirect_to(options = {}, response_options = {})
raise ActionControllerError.new("Cannot redirect to nil!") unless options
raise AbstractController::DoubleRenderError if response_body
self.status = _extract_redirect_to_status(options, response_options)
self.location = _compute_redirect_to_location(request, options)
self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.unwrapped_html_escape(response.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.
Примеры:
redirect_to action: "show", id: 5
redirect_to @post
redirect_to "http://www.rubyonrails.org"
redirect_to "/images/screenshot.jpg"
redirect_to posts_url
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 в нашем контроллере выполняются, поэтому redirect_to не останавливает выполнение функции. Чтобы немедленно завершить выполнение функции после redirect_to, используйте return.
redirect_to post_url(@post) and return
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.