module ActionController::Redirecting - actionpack-4.2.3 Documentation

# module ActionController::Redirecting

### Public Instance Methods

redirect_to(options = {}, response_status = {}) click to toggle source

Redirects the browser to the target specified in `options`. This parameter can be any one of:

- `Hash` - The URL will be generated by calling url_for with the `options`.

- `Record` - The URL will be generated by calling url_for with the `options`, which will reference a named URL for that record.

- `String` starting with `protocol://` (like `http://`) or a protocol relative reference (like `//`) - Is passed straight through as the target for redirection.

- `String` not containing a protocol - The current protocol and host is prepended to the string.

- `Proc` - A block that will be executed in the controller's context. Should return any option accepted by `redirect_to`.

- `:back` - Back to the page that issued the request. Useful for forms that are triggered from multiple places. Short-hand for `redirect_to(request.env["HTTP_REFERER"])`

### Examples:¶ ↑

    redirect_to action: "show", id: 5
    redirect_to post
    redirect_to "http://www.rubyonrails.org"
    redirect_to "/images/screenshot.jpg"
    redirect_to articles_url
    redirect_to :back
    redirect_to proc { edit_post_url(@post) }

The redirection happens as a “302 Found” header unless otherwise specified using the `:status` option:

    redirect_to post_url(@post), status: :found
    redirect_to action: 'atom', status: :moved_permanently
    redirect_to post_url(@post), status: 301
    redirect_to action: 'atom', status: 302

The status code can either be a standard HTTP Status code as an integer, or a symbol representing the downcased, underscored and symbolized description. Note that the status code must be a 3xx HTTP code, or redirection will not occur.

If you are using XHR requests other than GET or POST and redirecting after the request then some browsers will follow the redirect using the original request method. This may lead to undesirable behavior such as a double DELETE. To work around this you can return a `303 See Other` status code which will be followed using a GET request.

    redirect_to posts_url, status: :see_other
    redirect_to action: 'index', status: 303

It is also possible to assign a flash message as part of the redirection. There are two special accessors for the commonly used flash names `alert` and `notice` as well as a general purpose `flash` bucket.

    redirect_to post_url(@post), alert: "Watch it, mister!"
    redirect_to post_url(@post), status: :found, notice: "Pay attention to the road"
    redirect_to post_url(@post), status: 301, flash: { updated_post_id: @post.id }
    redirect_to({ action: 'atom' }, alert: "Something serious happened")

When using `redirect_to :back`, if there is no referrer, `ActionController::RedirectBackError` will be raised. You may specify some fallback behavior for this case by rescuing `ActionController::RedirectBackError`.

    # File lib/action_controller/metal/redirecting.rb, line 69
    def redirect_to(options = {}, response_status = {}) #:doc:
      raise ActionControllerError.new("Cannot redirect to nil!") unless options
      raise ActionControllerError.new("Cannot redirect to a parameter hash!") if options.is_a?(ActionController::Parameters)
      raise AbstractController::DoubleRenderError if response_body

      self.status        = _extract_redirect_to_status(options, response_status)
      self.location      = _compute_redirect_to_location(request, options)
      self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.unwrapped_html_escape(location)}\">redirected</a>.</body></html>"
    end

### Private Instance Methods

_extract_redirect_to_status(options, response_status) click to toggle source

    # File lib/action_controller/metal/redirecting.rb, line 102
    def _extract_redirect_to_status(options, response_status)
      if options.is_a?(Hash) && options.key?(:status)
        Rack::Utils.status_code(options.delete(:status))
      elsif response_status.key?(:status)
        Rack::Utils.status_code(response_status[:status])
      else
        302
      end
    end