views:

40

answers:

1

Hello world!

We have a form to submit ratings for a certain restaurant in a in our views/restaurants/show.html.erb. We only want logged in users to create new ratings. We put

before_filter :login_required, :only => [ :new, :create ]

(but we also tried only ":create") on top of our RatingsController. If we click the submit button after typing in the rating details we are prompted to log in (which is what we want). After filling in username and password and submitting the login form we get redirected back to e. g. /restaurants/36/ratings, but we want to be redirected back to where we came from - e. g. /restaurants/36/. We tried redirect_to(:back), but this redirects us back to the login form. Also the new rating does not get saved to the database.

Any idea how we can change the redirection and how to make sure the rating gets saved?

Thanks!

A: 

Disclaimer: I don't use restful-authentication. (You might look into authlogic if you have a choice -- there's a Railscast about it if you want an intro.) Even so, storing the "back" value in the session should still work out. Here's what I do in my situation:

# app/controllers/application.rb

before_filter :authorize

protected

  # Override in controller classes that should NOT require authentication (such as logging in, by definition)
  def require_login?
    return true
  end

private

  def authorize
    if require_login? && current_user.nil?
      session['return_to'] = request.request_uri
      redirect_to login_url

      return false
    end
  end

# app/controllers/user_sessions_controller.rb

def create
  # [...]

  if @user_session.save
    flash[:notice] = 'Successfully logged in.'

    if session['return_to'].nil?
      redirect_to root_url
    else
      redirect_to session['return_to']
    end
  else
    render :action => 'new'
  end
end

# app/controllers/users_controller.rb

# Just as an example:
def require_login?
  return case action_name
  when 'new'
    false
  when 'create'
    false
  else
    true
  end
end

My application requires almost every action to require authentication, which is why I have require_login? return true. I think you could adjust the session['return_to'] idea to your needs.

I think I got part of this idea from this post: http://www.urubatan.info/2007/10/a-very-simple-login-example-with-rails/

Benjamin Oakes