2

我是Rails的新手。

所以...在我的 Rails 应用程序中,我有 OmniAuth Facebook 集成,我想在我的数据库中添加一些字段,例如名字、姓氏和位置。

我关注了这个wiki,我有一个简单的登录,但没有额外的字段(名字、姓氏、位置)。

所以,我在我的config/initializers/devise.rb 中添加了这个:

require 'omniauth-facebook'
config.omniauth :facebook, '123456...', '123456...',
    scope: 'first_name, last_name, location',
    stategy_class: OmniAuth::Strategies::Facebook

所以,如果我是正确的,上面会要求这些额外的字段。

现在,在我的模型 user.rb 中,我想添加 3 行,它将请求的值传递给数据库。

def self.find_for_facebook_omniauth(omniauth, signed_in_resource=nil)
  basic = {
      provider:  omniauth.provider,
      uid:       omniauth.uid,
      }
  User.where(basic).first || User.create(basic.merge(
      firstname: omniauth.info.firstname,  # these are the
      lastname:  omniauth.info.lastname,   # lines I'm not
      location:  omniauth.info.location,   # sure of
      email:     omniauth.info.email,
      password:  Devise.friendly_token[0,20],
      ))
end
4

1 回答 1

1

假设您omniauth是,那么您可能会发现哈希request.env["omniauth.auth"]中不包含其他字段。.info

在这种情况下,使用 更安全.extra.raw_info,它将包含其他范围的字段。


在这里我请求了额外的范围user_hometown,我们可以看到它在info散列中丢失了:

>> auth.info
=> #<OmniAuth::AuthHash::InfoHash email="dukedave@gmail.com" first_name="Dave" image="http://graph.facebook.com/508528599/picture?type=square" last_name="Tapley" name="Dave Tapley" nickname="dave.tapley" urls=#<OmniAuth::AuthHash Facebook="https://www.facebook.com/dave.tapley"> verified=true>

但出现在extra.raw_info(之后gender):

>> auth.extra.raw_info
=> #<OmniAuth::AuthHash email="dukedave@gmail.com" first_name="Dave" gender="male" hometown=#<OmniAuth::AuthHash id="105540216147364" name="Phoenix, Arizona"> id="508528599" last_name="Tapley" link="https://www.facebook.com/dave.tapley" locale="en_US" name="Dave Tapley" timezone=-7 updated_time="2013-11-22T22:10:26+0000" username="dave.tapley" verified=true>
于 2013-11-22T22:36:48.433 回答