验证表示列不是唯一的,但仍然无法通过该列找到记录

时间:2012-09-11 09:07:33

标签: ruby-on-rails ruby-on-rails-3 activerecord activemodel

我有一个可以从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保存!为零:NilClass`。由于验证说电子邮件已经存在,我的finder应该返回一个现有的用户记录,但现在它返回nil。怎么会发生这种情况?

对于记录,我记录了错误,电子邮件是一个正确的电子邮件地址。这种情况大约每天发生一次,我自己无法重现。

1 个答案:

答案 0 :(得分:0)

可能是这行原因问题,因为如果找不到用户,它将返回nil,你没有引发异常,你正在记录异常,

user = User.find_by_email(user.email)

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