2013-08-01 102 views
0

我正在爲Devise進行Facebook身份驗證,我偶然發現了一個問題 - 何時會嘗試使用已經在系統中的Facebook電子郵件註冊某人,我收到一個錯誤(部分正確)。Rails - 如何避免在模型中創建記錄時出現驗證錯誤?

我需要將該用戶重定向回主頁,並在那裏打印出此問題,但目前我將此消息打印爲錯誤(在本地主機上)。

以下是我正在做的是(用戶模型):

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) 
    data = access_token.extra.raw_info 

    if user = User.where(:provider => 'facebook', :uid => data.id).first 
     user 
    else # Create a user with a stub password. 
     user = User.create!(:first_name => data.first_name, 
          :last_name => data.last_name, 
          :email => data.email, 
          :password => Devise.friendly_token[0,20], 
          :provider => 'facebook', 
          :uid => data.id, 
          :terms_of_use => true) 
    end 
    return user if user 
    end 

如何將用戶重定向哪裏會被打印出來的驗證消息的網頁上?

感謝

回答

1

你爲什麼不有這樣的事情在你的模型和控制器

Return just the user object from the method

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) 
    data = access_token.extra.raw_info 
    #Look for the first user with provider: :facebook & uid: data.id, 
    #If now user is there go ahead and create one with first_or_create. 
    user = User.where(:provider => 'facebook', :uid => data.id).first_or_create do |user| 
      user.first_name = data.first_name, 
      user.last_name = data.last_name, 
      user.email = data.email, 
      user.password = Devise.friendly_token[0,20], 
      user.provider = 'facebook', 
      user.uid = data.id, 
      user.terms_od_use = true 
      end 
    end 

Controller

def sign_in_method #dummy method 
    user = User.find_for_facebook_oauth(access_token, signed_in_resource=nil) 
    if user.valid? 
    redirect success_url #any url where u want to redirect on success 
    else user.errors 
    redirect root_url, error: user.errors.full_messages.join(', ') 
    end 
end 
+0

你有沒有聽說過first_or_create?這段代碼很糟糕。 –

+0

我知道這太糟糕了。我想給他一個關於如何進行錯誤和重定向的想法,而不是重構。因爲這是他所問的。 – AnkitG

+0

@MichaelSzyndel,增加了'first_or_create';) – AnkitG

相關問題