Gareth Burrows
Gareth Burrows

Reputation: 1182

Rails: Conditional redirect in rails app controller

I have an action in a controller that I call from two different views. In each case, I want the action to redirect back to the page on which the link was clicked. At the moment I am doing this...

In this view I am passing a parameter like this...

%a.showtooltip#wprofile{:href => idea_vote_up_path(@idea, :source => 'idea'),  :title => 'Awesome idea - vote up !', }

and in the controller...

if params[:source] == 'idea'
  redirect_to idea
else
  redirect_to ideas_path
end

This works fine, but does not feel elegant, especially as it ends up being in a few actions. Is there a better way?

Upvotes: 5

Views: 2588

Answers (3)

karns
karns

Reputation: 5847

I find that a good way is to have a hidden input with the value you'd like to be as the return url. Seems like an easily manageable solution and has worked for me. This way you can create the hidden input in 1 or 1000 views and have a single line of code in the controller to do the redirects. I can't immediately think of what the cons to this approach would be.

In form

hidden_field_tag(:redirect_to, params[:redirect_to]) # in the form that is to be submitted, value determined by a query string
hidden_field_tag(:redirect_to, "/a/direct/value") # in the form, value specified directly

In controller

redirect_to params[:redirect_to].presence || idea_path(@idea)

Didn't test the code and don't know ruby sups well so double check but the logic should stand. The ".presence" takes care of situations where you don't want a custom redirect to and have no hidden input to specify.

Upvotes: 0

Vlad
Vlad

Reputation: 901

Store the referrer in the session like so session[:previous] ||= request.referer and use it as redirect_to session.delete(:previous)

Upvotes: 1

Bongs
Bongs

Reputation: 5592

You can rewrite it in following way:

redirect_to params[:source] == 'idea' ? idea : ideas_path

If you want to redirect back to the page (refresh current page)

redirect_to request.referer

Upvotes: 5

Related Questions