首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OmniAuth Facebook的实现

OmniAuth Facebook的实现
EN

Stack Overflow用户
提问于 2014-07-01 21:55:57
回答 1查看 75关注 0票数 0

我有下面的表结构,其中用户有许多Oauths。

代码语言:javascript
运行
复制
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多次登录。我想把橡皮泥分成一张新桌子。

用户模型

代码语言:javascript
运行
复制
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,以检查用户是否存在,否则将为该用户创建一个新记录。

EN

回答 1

Stack Overflow用户

发布于 2014-07-02 17:41:11

where类方法中调用User方法。您必须显式地调用正确的模型中的where方法。你应该有这样的东西:

代码语言:javascript
运行
复制
# 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24519860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档