модуль ActionDispatch::Routing::Redirection
Общедоступные методы экземпляра
# File actionpack/lib/action_dispatch/routing/redirection.rb, line 178 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")
Вы также можете использовать интерполяцию в переданном аргументе перенаправления:
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. Используйте { ... } вместо этого.
Вариант с параметрами redirect позволяет указать только те части URL, которые нужно изменить, он также поддерживает интерполяцию пути, аналогично первому примеру.
get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
Наконец, можно передать объект, который отвечает на вызов, в redirect, что позволит повторно использовать общие маршруты перенаправления. Метод call должен принимать два аргумента, params и request, и возвращать строку.
get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.