module ActionController::Redirecting

def _compute_redirect_to_location(options)

def _compute_redirect_to_location(options)
  case options
  # The scheme name consist of a letter followed by any combination of
  # letters, digits, and the plus ("+"), period ("."), or hyphen ("-")
  # characters; and is terminated by a colon (":").
  # The protocol relative scheme starts with a double slash "//"
  when %r{^(\w[\w+.-]*:|//).*}
    options
  when String
    request.protocol + request.host_with_port + options
  when :back
    raise RedirectBackError unless refer = request.headers["Referer"]
    refer
  when Proc
    _compute_redirect_to_location options.call
  else
    url_for(options)
  end.gsub(/[\0\r\n]/, '')
end

def _extract_redirect_to_status(options, response_status)

def _extract_redirect_to_status(options, response_status)
  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

def redirect_to(options = {}, response_status = {}) #:doc:

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

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

+alert+ and +notice+ as well as a general purpose +flash+ bucket.
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

redirect_to :action => 'index', :status => 303
redirect_to posts_url, :status => :see_other
Examples:

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

Note that the status code must be a 3xx HTTP code, or redirection will not occur.
integer, or a symbol representing the downcased, underscored and symbolized description.
The status code can either be a standard {HTTP Status code}[http://www.iana.org/assignments/http-status-codes] as an

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

The redirection happens as a "302 Moved" header unless otherwise specified.

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

Short-hand for redirect_to(request.env["HTTP_REFERER"])
* :back - Back to the page that issued the request. Useful for forms that are triggered from multiple places.
* Proc - A block that will be executed in the controller's context. Should return any option accepted by +redirect_to+.
* String not containing a protocol - The current protocol and host is prepended to the string.
* String starting with protocol:// (like http://) or a protocol relative reference (like //) - Is passed straight through as the target for redirection.
* Record - The URL will be generated by calling url_for with the +options+, which will reference a named URL for that record.
* Hash - The URL will be generated by calling url_for with the +options+.

Redirects the browser to the target specified in +options+. This parameter can take one of three forms:
def redirect_to(options = {}, response_status = {}) #:doc:
  raise ActionControllerError.new("Cannot redirect to nil!") unless options
  raise AbstractController::DoubleRenderError if response_body
  self.status        = _extract_redirect_to_status(options, response_status)
  self.location      = _compute_redirect_to_location(options)
  self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.h(location)}\">redirected</a>.</body></html>"
end