module ActionDispatch::Routing::Redirection
Публичные методы экземпляра
# File actionpack/lib/action_dispatch/routing/redirection.rb, line 206 def redirect(*args, &block) options = args.extract_options! status = options.delete(:status) || 301 path = args.shift source_location = caller[0] if ActionDispatch.verbose_redirect_logs return OptionRedirect.new(status, options, source_location) if options.any? return PathRedirect.new(status, path, source_location) if String === path block = path if path.respond_to? :call raise ArgumentError, "redirection argument not supported" unless block Redirect.new status, block, source_location 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 для блока перенаправления не сработает, поскольку Ruby передаст блок методу get, а не redirect. Вместо этого используйте { ... }.
Вариант 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.
Наконец, в redirect можно передать объект, отвечающий на вызов call, что позволяет повторно использовать общие маршруты перенаправления. Метод call должен принимать два аргумента — параметры и запрос — и возвращать строку.
get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.