NoMethodError - nil的未定义方法`user':NilClass

时间:2013-04-11 03:28:51

标签: ruby-on-rails ruby omniauth

我正在使用Omniauth尝试在我的网络应用上注册/登录用户。 这发生在我的AuthenticationsController#Create方法中:

身份验证控制器:

class AuthenticationsController < InheritedResources::Base

  def create
    omniauth = request.env['omniauth.auth']
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
      flash[:success] = "Signed in successfully"
      sign_in_and_redirect(authentication.user)
    elsif current_user
      token = omniauth['credentials'].token
      secret = omniauth['credentials'].secret
      current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => token, :secret => token_secret)
      flash[:success] = "Authentication successful"
      redirect_to authentications_url
    else
      user = User.new
      user.apply_omniauth(omniauth)
      if user.save!
        flash[:success] = "Account created"
        sign_in(authentication.user)
      else
        session[:omniauth] = omniauth.except('extra')
        redirect_to '/signup'
      end
    end
  end

我最初有sign_in(:user, authentication.user),但它给了我参数错误,因此我在上面的代码中将其更改为had sign_in(authentication.user)。但是,现在我得到NoMethodError - undefined method 'user' for nil:NilClass

3 个答案:

答案 0 :(得分:1)

第23行sign_in(authentication.user)失败,因为您处于if authentication条件的else分支(因此authentication为零)。 您可能要做的是为刚刚创建了几行的用户致电sign_in(user)

答案 1 :(得分:0)

首先测试是否定义了authentication,然后在else块中,只有在未定义的情况下才会触发,出于某种原因,您将引用authentication.user。这可能无法奏效。

如果您未经过身份验证且未登录,则该条件似乎适用。在这种情况下,您为什么要使用sign_in函数?

答案 2 :(得分:0)

如果您在数据库中使用了一组提供程序,请确保

> :provider => omniauth['provider']

例如,与db中的提供程序匹配。如果您的数据库中有facebook_Oauth2且提供程序响应为facebook,则验证将失败。