0

由于这个其他问题,我已经修改了我的范围,所以现在我请求正确的权限,以便我可以将用户的性别和位置保存到数据库。

这是我保存所有信息栏性别和位置的 user.rb 代码。遵循 auth.info.name 等设置的协议后,性别或位置都不会被保存甚至检索。

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

这是我发送的范围

  Rails.application.config.middleware.use OmniAuth::Builder do
  provider :youtube, YOUTUBE_KEY, YOUTUBE_SECRET, { :scope => "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://gdata.youtube.com", access_type: 'offline', approval_prompt: '' }
end

路线

match 'auth/youtube/callback', to: 'sessions#create'

有谁知道保存这两个值的正确方法?

4

1 回答 1

2

这里的问题是您在omniauth 哈希中的错误位置查找该信息。如果您将以下代码行添加到控制器操作的开头:

render :text => "<pre>" + env["omniauth.auth"].to_yaml and return

您将能够检查 OAuth 提供程序返回的散列内容并看到它gender,并且locale位于extra散列的键内。

因此,这里的答案只是将两条违规行更改为:

user.gender = auth.extra.raw_info.gender
user.country = auth.extra.raw_info.locale
于 2013-01-18T14:44:47.427 回答