Module: ActionDispatch::Routing::Redirection
- Included in:
- Mapper
- Defined in:
- actionpack/lib/action_dispatch/routing/redirection.rb
Instance Method Summary collapse
-
#redirect(*args, &block) ⇒ Object
Redirect any path to another path:.
Instance Method Details
#redirect(*args, &block) ⇒ Object
Redirect any path to another path:
match "/stories" => redirect("/posts")
You can also use interpolation in the supplied redirect argument:
match 'docs/:article', :to => redirect('/wiki/%{article}')
Alternatively you can use one of the other syntaxes:
The block version of redirect allows for the easy encapsulation of any logic associated with the redirect in question. Either the params and request are supplied as arguments, or just params, depending of how many arguments your block accepts. A string is required as a return value.
match 'jokes/:number', :to => redirect do |params, request|
path = (params[:number].to_i.even? ? "/wheres-the-beef" : "/i-love-lamp")
"http://#{request.host_with_port}/#{path}"
end
The options version of redirect allows you to supply only the parts of the url which need to change, it also supports interpolation of the path similar to the first example.
match 'stores/:name', :to => redirect(:subdomain => 'stores', :path => '/%{name}')
match 'stores/:name(*all)', :to => redirect(:subdomain => 'stores', :path => '/%{name}%{all}')
Finally, an object which responds to call can be supplied to redirect, allowing you to reuse common redirect routes. The call method must accept two arguments, params and request, and return a string.
match 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'actionpack/lib/action_dispatch/routing/redirection.rb', line 98 def redirect(*args, &block) = args.last.is_a?(Hash) ? args.pop : {} status = .delete(:status) || 301 return OptionRedirect.new(status, ) if .any? path = args.shift block = lambda { |params, request| (params.empty? || !path.match(/%\{\w*\}/)) ? path : (path % escape(params)) } if String === path block = path if path.respond_to? :call # :FIXME: remove in Rails 4.0 if block && block.respond_to?(:arity) && block.arity < 2 msg = "redirect blocks with arity of #{block.arity} are deprecated. Your block must take 2 parameters: the environment, and a request object" ActiveSupport::Deprecation.warn msg deprecated_block = block block = lambda { |params, _| deprecated_block.call(params) } end raise ArgumentError, "redirection argument not supported" unless block Redirect.new status, block end |