2012-11-14 50 views
0

我正在嘗試爲我當前的設計系統添加身份驗證控制器,以提供與Facebook和Twitter的多個登錄。 要做到這一點,我遵循本教程:http://railscasts.com/episodes/236-omniauth-part-2Rails - 生成不會在數據庫中創建記錄

我的問題是,誰尚未註冊,並試圖註冊與Twitter的人。 所以我需要爲此創建用戶和身份驗證。

我的代碼如下:

 user = User.new 
     token = omni['credentials'].token 
     token_secret = omni['credentials'].secret 
     user.provider = omni.provider 
     user.uid = omni.uid 

     user.authentications.build(:provider => omni['provider'], :uid => omni['uid'], :token => token, :token_secret => token_secret) 

     if user.save 
     flash[:notice] = "Logged in." 
     sign_in_and_redirect(:user, user)     
     else 
     session["devise.user_attributes"] = user.attributes 
     redirect_to new_user_registration_path 
     end 

因此,在登記過程的結束時,創建的新用戶。但是在數據庫中,我沒有看到有關該用戶的任何Twitter認證記錄。

是因爲user.authentications.build?

如果你能幫助我,那會很棒。

謝謝。

回答

3

作爲一個數據點:您所指的railscasts引用了Omniauth 1.0之前的版本,它與railscsts引用的策略略有不同。 (注意:我正在使用您在現場網站上引用的確切方法)。在這種情況下,構建調用「apply_omniauth」 -

確保您已創建(如他們在視頻中所述),構建資源的註冊控制器。這是我當前的工作例如:

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super 
    session[:omniauth] = nil unless @user.new_record? 
    end 

    private 

    def build_resource(*args) 
    super 
    if session[:omniauth] 
     # apply omniauth calls the user model and applies omniauth session to the info 
     @user.apply_omniauth(session[:omniauth]) 

     # 
     @user.valid? 
    end 
    end 
end 

但是,你仍然需要創建認證記錄,這裏是我的確切電話:

current_user.authentication.create!(:provider => omniauth['provider'], :uid => omniauth['uid']) 

希望它能幫助。

+0

所以基本上,除了註冊控制器,你正在使用創建!而不是構建? – CanCeylan

+0

正確。正如Jesse在下面所說的,之所以是構建和創建的區別之所在。 – Chris

+0

是的非常感謝你的工作。我寫了一個包含更新的gems和rails版本的所有流程的教程:http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/ – CanCeylan

0

我想如果你使用的是Devise + Omniauth,你可以看看這個更近的Railscast。在新版Devise gem中有OmniAuth的本地支持。

+0

是的,我建我的網站有尊重該教程。但是現在我想提供多重身份驗證。這就是爲什麼我要創建新的控制器 – CanCeylan

2

是的,這是因爲身材

User.build # allocates a new record for you 
User.create # allocates and then saves a new record for you 

所以我想你想

user.authentications.create(:provider => omni['provider'], 
          :uid => omni['uid'], 
          :token => token, 
          :token_secret => token_secret) 

此外,還應該處理在創建不保存的情況下(驗證問題)

+0

但是例如在用戶使用twitter進行身份驗證的情況下,要求在保存前輸入電子郵件。在那個階段,用戶可能會取消註冊過程。那麼我不會有無用戶的身份驗證記錄? – CanCeylan

+0

順便說一句,在這個問題我得到這個錯誤:「你不能調用創建,除非父母被保存」,因爲我還沒有保存我的用戶呢。 – CanCeylan

0

是的,這是因爲構建,它是用來建立一個記錄而不保存在數據庫(如新)。

如果你的模型,你有一個Userhas_many :authentications,您可以設置autosave選項設置爲true自動保存認證時,要保存的用戶:

has_many :authentications, autosave: true

+0

不,我添加了自動保存,但它仍然只創建用戶:/ – CanCeylan

+0

o_O,它可能是一個錯誤,您是否使用RoR的最後一個版本? –

相關問題