0

我有以下表结构,其中用户有许多 Oauth。

create_table :users do |t|
      t.string :name
      t.string :email
      t.string :age
      t.string :gender

      t.timestamps


create_table :oauths do |t|
      t.string :provider
      t.string :provider_uid
      t.string :oauth_token
      t.datetime :oauth_expires_at
      t.text :meta
      t.integer :user_id

      t.timestamps

因为我将允许用户使用 Facebook、twitter、foursquare 进行多次登录。我想将 oauth 分离到一个新表中。

用户模型

def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
      user.name = auth.info.name
      user.email = auth.info.email
      user.oauths.provider = auth.provider
      user.oauths.provider_uid = auth.uid
      user.oauths.oauth_token = auth.credentials.token
      user.oauths.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.save!
      user.oauths.save!
    end
  end

我不知道如何从 Oauths 表中查询提供者和 uid 以检查用户是否存在,否则为该用户创建新记录。

4

1 回答 1

1

您正在调用类where方法内部的User方法。您必须明确并where在正确的模型中调用该方法。你应该有这样的东西:

# app/models/user.rb
def self.from_omniauth(auth)
  oauth = Oauth.find_by(auth.slice(:provider, :uid))
  if oauth
    oauth.user
  else
    User.create(...)
  end
end

注意:我使用find_by(...)而不是where(...).first因为您使用的是 Rails 4。

于 2014-07-02T17:41:11.013 回答