Spec-Zone.ru › Ruby on Rails 7.2

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

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

redirect(*args, &block) Показать исходный код
# File actionpack/lib/action_dispatch/routing/redirection.rb, line 204
def redirect(*args, &block)
  options = args.extract_options!
  status  = options.delete(:status) || 301
  path    = args.shift

  return OptionRedirect.new(status, options) if options.any?
  return PathRedirect.new(status, path) if String === path

  block = path if path.respond_to? :call
  raise ArgumentError, "redirection argument not supported" unless block
  Redirect.new status, block
end

Перенаправить любой путь на другой путь:

get "/stories" => redirect("/posts")

Это перенаправит пользователя, игнорируя определённые части запроса, включая строку запроса и т. д. /stories, /stories?foo=bar, и т. д. все перенаправляются на /posts.

Перенаправление по умолчанию использует код состояния 301 Moved Permanently. Его можно изменить с помощью опции :status:

get "/stories" => redirect("/posts", status: 307)

Вы также можете использовать интерполяцию в переданном аргументе перенаправления:

get 'docs/:article', to: redirect('/wiki/%{article}')

Обратите внимание, что если вы возвращаете путь без ведущей косой черты, то URL предваряется переменной окружения SCRIPT_NAME. Обычно это ‘/’, но может отличаться в установленных движках или когда приложение развернуто в подкаталоге веб-сайта.

В качестве альтернативы можно использовать один из других синтаксисов:

Вариант с блоком redirect позволяет легко обобщить любую логику, связанную с перенаправлением. Либо параметры и запрос передаются в качестве аргументов, либо только параметры, в зависимости от того, сколько аргументов принимает ваш блок. В качестве значения возврата требуется строка.

get 'jokes/:number', to: redirect { |params, request|
  path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
  "http://#{request.host_with_port}/#{path}"
}

Обратите внимание, что синтаксис do end для блока redirect не будет работать, так как Ruby передаст блок в get вместо redirect. Используйте { ... } вместо этого.

Вариант с опциями позволяет указать только те части URL, которые нужно изменить, он также поддерживает интерполяцию пути, аналогично первому примеру.

get 'stores/:name',       to: redirect(subdomain: 'stores', path: '/%{name}')
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
get '/stories', to: redirect(path: '/posts')

Это перенаправит пользователя, изменив только указанные части запроса, например, опцию path в последнем примере. /stories, /stories?foo=bar, перенаправляются на /posts и /posts?foo=bar соответственно.

Наконец, можно передать объект, который отвечает методу call, что позволяет повторно использовать общие маршруты перенаправления. Метод call должен принимать два аргумента, params и request, и возвращать строку.

get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))

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

Spec-Zone.ru

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