身份验证后不需要的重定向

时间:2010-05-12 14:24:37

标签: ruby-on-rails restful-authentication

我们有一个表单,可以在我们的views / restaurants / show.html.erb中的某个餐厅提交评分。我们只希望登录用户创建新的评级。我们把

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

(但我们也只在我们的RatingsController上尝试了“:create”)。如果我们在输入评级详细信息后单击提交按钮,系统会提示您登录(这就是我们想要的)。填写用户名和密码并提交登录表单后,我们将重定向回e。 G。 / restaurants / 36 /评级,但我们希望被重定向回我们来自的地方 - e。 G。 /餐厅/ 36 /。我们尝试了redirect_to(:back),但是这会将我们重定向回登录表单。此新评级也不会保存到数据库中。

知道我们如何更改重定向以及如何确保评级得到保存?

谢谢!

1 个答案:

答案 0 :(得分:1)

免责声明:我不使用restful-authentication。 (如果你有一个选择,你可以查看authlogic - 如果你想要一个介绍,那就有一个Railscast about it。)即便如此,在会话中存储“后退”值仍然可以解决。这就是我在我的情况下做的事情:

# 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

我的应用程序几乎需要每个操作都需要身份验证,这就是我require_login?返回true的原因。我认为您可以根据需要调整session['return_to']想法。

我想我从这篇文章中得到了这个想法的一部分:http://www.urubatan.info/2007/10/a-very-simple-login-example-with-rails/