module ActionDispatch::Routing::Redirection
def redirect(*args, &block)
get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
arguments, params and request, and return a string.
allowing you to reuse common redirect routes. The call method must accept two
Finally, an object which responds to call can be supplied to redirect,
`/stories?foo=bar`, redirect to `/posts` and `/posts?foo=bar` respectively.
request, for example the `path` option in the last example. `/stories`,
This will redirect the user, while changing only the specified parts of the
get '/stories', to: redirect(path: '/posts')
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
the first example.
which need to change, it also supports interpolation of the path similar to
The options version of redirect allows you to supply only the parts of the URL
would pass the block to `get` instead of `redirect`. Use `{ ... }` instead.
Note that the `do end` syntax for the redirect block wouldn't work, as Ruby
}
"http://#{request.host_with_port}/#{path}"
path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
get 'jokes/:number', to: redirect { |params, request|
block accepts. A string is required as a return value.
supplied as arguments, or just params, depending of how many arguments your
associated with the redirect in question. Either the params and request are
The block version of redirect allows for the easy encapsulation of any logic
Alternatively you can use one of the other syntaxes:
deployed to a subdirectory of a website.
'/' but may be different in a mounted engine or where the application is
prefixed with the current SCRIPT_NAME environment variable. This is typically
Note that if you return a path without a leading slash then the URL is
get 'docs/:article', to: redirect('/wiki/%{article}')
You can also use interpolation in the supplied redirect argument:
get "/stories" => redirect("/posts", status: 307)
can be overridden with the `:status` option:
The redirect will use a `301 Moved Permanently` status code by default. This
to `/posts`.
including query string, etc. `/stories`, `/stories?foo=bar`, etc all redirect
This will redirect the user, while ignoring certain parts of the request,
get "/stories" => redirect("/posts")
Redirect any path to another path:
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