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