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` の場合。検証では電子メールが既に存在することが示されているため、ファインダーはその 1 つの既存のユーザー レコードを返す必要がありますが、今回は nil を返します。これはどのように発生しますか?

記録として、エラーをログに記録しました。メールは適切なメールアドレスです。これは 1 日に 1 回程度発生し、自分で再現することはできません。

4

1 に答える 1

0

ユーザーが見つからない場合はnilが返されるため、この行が問題を引き起こす可能性があります。例外を発生させていないため、例外をログに記録しています。

user = User.find_by_email(user.email)

あなたのコードは非常に複雑で、単純なコードを記述して上記の結果を達成できます。

于 2012-09-11T10:01:46.207 に答える