2013-04-11 510 views
0

我正在使用Omniauth嘗試在我的Web應用程序上註冊/登錄用戶。 這是我AuthenticationsController#Create方法內發生的事情:NoMethodError - 未定義的方法`user'for nil:NilClass

認證控制器:

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

回答

0

首先測試authentication是否定義,然後在else塊中,如果它沒有定義,它將只觸發,你去參考authentication.user出於某種原因。這不可能工作。

如果您未通過身份驗證並且未登錄,那麼該條件似乎適用。您爲什麼要在這些情況下使用sign_in函數?

+0

該控制器的正確「def創建」應該是什麼樣子?我試圖按照Railscast for omniauth – user2159586 2013-04-11 05:37:40

1

第23行sign_in(authentication.user)由於您處於if authentication條件的else分支(因此authentication爲零)而失敗。 您可能打算做的事情是撥打sign_in(user),您只需在上面創建幾行即可。

+0

我將其更改爲'sign_in_and_redirect(user)',但我仍然得到未定義的局部變量或方法'user' – user2159586 2013-04-11 05:36:40

0

如果您使用您的數據庫供應商的一組列表確保

> :provider => omniauth['provider'] 

與在數據庫供應商相匹配,例如。如果你的數據庫中有facebook_Oauth2,並且提供者的響應是facebook,那麼保證會失敗。

相關問題