2013-08-01 82 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

相关问题