我有下面的表结构,其中用户有许多Oauths。
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多次登录。我想把橡皮泥分成一张新桌子。
用户模型
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,以检查用户是否存在,否则将为该用户创建一个新记录。
发布于 2014-07-02 17:41:11
在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。
https://stackoverflow.com/questions/24519860
复制相似问题