【问题标题】:OmniAuth Facebook ImplementationOmniAuth Facebook 实施
【发布时间】:2014-07-03 01:41:11
【问题描述】:

我有以下表结构,其中一个用户有很多 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 以检查用户是否存在,否则为该用户创建新记录。

【问题讨论】:

  • 进一步分解方法。 first_or_initialize 不行。有一个很棒的 railscast 会很有帮助:railscasts.com/episodes/236-omniauth-part-2。请务必查看该系列的第 1 部分:railscasts.com/episodes/235-omniauth-part-1
  • @pdobb 会检查并返回这里:D
  • @HarshaMV 为什么在 oauths 表中已经有了 oauth_token 和 oauth_expires_at 字段?你不必要地重复你的领域。为什么不在你的用户表中有一个 oauth_id 并有像 oauth belongs_to :user 这样的适当关联?
  • @Mandeep 我正在测试应用程序,因为我无法从 oauths 表中获取内容。请忽略:D
  • @HarshaMV 没有问题:D 顺便说一句,我认为您可以为您的用户提供一个实例方法,如果您的关联设置正确,那么在该方法中您可以检查是否已经存在该关联与否,诸如 user.oauths 之类的东西会为您提供与该用户相关联的各种 oauth 的集合,您可以从那里检查该提供者是否存在,如果不存在则创建一个

标签: ruby-on-rails facebook ruby-on-rails-4 omniauth omniauth-facebook


【解决方案1】:

您正在 User 类方法中调用 where 方法。您必须明确并在正确的模型中调用 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。

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2015-04-20
    • 2016-09-23
    • 2014-05-23
    • 2012-03-05
    相关资源
    最近更新 更多