Spec-Zone.ru › Ruby on Rails 5.2

модуль ActionController::Redirecting

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

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

redirect_back(fallback_location:, allow_other_host: true, **args) Показать исходный код
# 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, принимаются как параметры, и поведение идентично.

redirect_to(options = {}, response_status = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/redirecting.rb, line 58
def redirect_to(options = {}, response_status = {})
  raise ActionControllerError.new("Cannot redirect to nil!") unless options
  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(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–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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