4

authlogic在我的 Rails 应用程序中使用身份验证。我需要能够在 current_user 登录时调用他们的方法,但它返回 nil。

在我的 user_sessions_controller.rb

def create
  @user_session = UserSession.new(params[:user_session])

  if @user_session.save
    current_user.increment_login_count_for_current_memberships!
    flash[:notice] = 'Sign in successful.'
    redirect_to root_path
  else
    render action: "new"
  end
end

而且它回来了……

Failure/Error: click_button "Sign in"
     NoMethodError:
       undefined method `increment_login_count_for_current_memberships!' for nil:NilClass

我在这里看到了一个类似的问题Not able to set a current_user using Authlogic on Rails 3.0.1答案是 disable basic_auth,但我正在使用basic_auth我的应用程序的管理端,所以我不能简单地禁用它。

  • 为什么我不能打电话给current_user这里?

  • 如果我不能current_user在这里打电话,有没有办法设置它?

4

2 回答 2

2

在我自己的应用程序中,我定义了这两种方法(以及其他方法)lib/authlogic_helper.rb(我假设你也这样做):

module AuthlogicHelper
  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.user
  end
end

这些方法似乎与您的答案中的代码完全一样,只是调用了用户会话实例变量,@current_user_session而不是@user_session像您的控制器代码中那样。

如果您@current_user_session在控制器操作中将用户会话变量重命名为,则该current_user_session方法将短路并返回您刚刚创建的会话,这应该允许该current_user方法返回正确的用户。

于 2012-04-18T11:54:48.183 回答
1

我仍然不知道为什么我不能打电话current_user@current_user在这里。但是我在控制器代码中找到了两种调用 current_user 的方法......

UserSession.find.user.increment_login_count_for_current_memberships!

@user_session.user.increment_login_count_for_current_memberships!

如果有人想弄清楚为什么我不能current_user在这里打电话,我会很高兴地奖励你赏金:)

于 2012-04-13T07:12:24.647 回答