Posted on April 04, 2008  

Redirecting users back in Rails should be as simple as:

redirect_to :back

See this ticket for more on a related patch applied to rails in early 2006.

The problem with Rails’ default handing of redirect_to :back is that it throws an exception when the HTTP referrer field has not been set by a visiting browser (or bot).

To be fair — this is probably the most desirable default behavior, given the circumstances.

One solution is simple, to write a wrapper method that you can call from your controllers that does the same thing, only with nil check on request.env“HTTP_REFERER”. Place this in your application.rb file (protected method):

def redirect_back(redirect_opts = nil)

  redirect_opts ||= {:controller => 'dashboard'}

  request.env["HTTP_REFERER"] ? redirect_to(request.env["HTTP_REFERER"]) : redirect_to(redirect_opts)

end

Replace “{:controller => ’dashboard’}” of course with the desired default controller/action/etc for your app.

Google Food

This is the error message Rails throws when the HTTP_REFERER environment variable has not been passed by the browser (perhaps as a result of copy & pasting a URL instead of clicking on it directly):

No HTTP_REFERER was set in the request to this action, so redirect_to :back could not be called successfully. If this is a test, make sure to specify @request.env“HTTP_REFERER”.

Hope this helps!

Leave a Reply