instance method redirect

Ruby on Rails 3.2.22.5

Since v3.1.12

Available in: v3.1.12 v3.2.22.5 v4.0.13 v4.1.16 v4.2.9 v5.2.8.1 v6.0.6 v6.1.7.10 v7.0.10 v7.1.6 v7.2.3 v8.0.4 v8.1.2

Signature

redirect(*args, &block)

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 { |params, request|
  path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
  "http://#{request.host_with_port}/#{path}"
}

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'))

Parameters

args rest
block block
Source
# File actionpack/lib/action_dispatch/routing/redirection.rb, line 98
      def redirect(*args, &block)
        options = args.last.is_a?(Hash) ? args.pop : {}
        status  = options.delete(:status) || 301

        return OptionRedirect.new(status, options) if options.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

Defined in actionpack/lib/action_dispatch/routing/redirection.rb line 98 · View on GitHub · Improve this page · Find usages on GitHub

Defined in ActionDispatch::Routing::Redirection

Type at least 2 characters to search.

↑↓ navigate · open · esc close