0

我有一种方法可以从 facebook 用户帐户创建用户。我验证email列以确保它是唯一的。

class User < ActiveRecord::Base
  validates :email,
    :'validators/email' => true,
    allow_nil: true,
    uniqueness:{ case_sensitive: false }

有时在生产中,FB 用户无法创建帐户。它说用户的电子邮件已经存在于数据库中。因此,如果发生这种情况,我编写了一些代码来获取现有用户。

  def self.create_by_facebook()
    user = User.new()
    user.email = facebook_get_me()['email']

    # new code
    if user.invalid?
      if user.errors[:email].join.include?('already registered') #custom msg
        user = User.find_by_email(user.email)
        if user.nil?
          FacebookLogger.error("  no user is found by facebook email")
        end
      end
    end

    begin
      user.save!
    rescue ActiveRecord::RecordInvalid => e
      raise
    end

    user
  end

但是,这次错误是undefined method保存!对于 nil:NilClass`。由于验证表明电子邮件已经存在,我的查找器应该返回一个现有的用户记录,但现在它返回 nil。这怎么会发生?

作为记录,我已经记录了错误,并且电子邮件是正确的电子邮件地址。这大约每天发生一次,我自己无法重现。

4

1 回答 1

0

可能是这条线导致问题,因为如果找不到用户,它将返回 nil,您没有引发异常,您正在记录异常,

user = User.find_by_email(user.email)

您的代码非常复杂,您可以编写简单的代码来实现上述结果。

于 2012-09-11T10:01:46.207 回答