0

omniauth-facebookRails 4 Web サイトでユーザーを認証するために gem を使用しています。

ユーザーが最初に参加したときに、500 の無料ポイントを提供したいと考えています。しかし、モデル メソッドでそのフィールドを 500 に設定すると、ユーザーがログインするたびに 500 ポイントにリセットされます。

class User < ActiveRecord::Base

  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.first_name = auth.info.first_name
      user.last_name = auth.info.last_name
      user.image = auth.info.image
      user.location = auth.info.location
      user.facebookpage = auth.info.urls.Facebook
      user.email = auth.extra.raw_info.email

      # This works but every time a user logs in it resets their points.
      user.points = 500 

      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.save!
    end
  end

end

最初のアカウント作成時にのみ 500 ポイントを割り当てる方法に関する提案。

4

1 に答える 1

0

それが first_or_initialize です!

Railsのドキュメントから

# Find the first user named Scarlett or create a new one with a particular last name.
User.where(:first_name => 'Scarlett').first_or_create(:last_name => 'Johansson')
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'>

# Find the first user named Scarlett or create a new one with a different last name.
# We already have one so the existing record will be returned.
User.where(:first_name => 'Scarlett').first_or_create do |user|
  user.last_name = "O'Hara"
end
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'>

find_or_createは を補完しfirst_or_initialize、前者はオブジェクトを永続化します。ソース

于 2013-07-20T21:49:08.907 に答える