【发布时间】:2017-07-07 18:16:44
【问题描述】:
我在我的 ruby on rails 应用程序中使用了omniauth (omniauth-facebook)。我想知道我是否可以检索用户的城市、国家和性别信息。以及如何使用carrierwave拍摄用户个人资料照片,
谢谢。
【问题讨论】:
标签: ruby-on-rails carrierwave omniauth omniauth-facebook
我在我的 ruby on rails 应用程序中使用了omniauth (omniauth-facebook)。我想知道我是否可以检索用户的城市、国家和性别信息。以及如何使用carrierwave拍摄用户个人资料照片,
谢谢。
【问题讨论】:
标签: ruby-on-rails carrierwave omniauth omniauth-facebook
使用(载波文档)[https://github.com/carrierwaveuploader/carrierwave] 作为我的参考,您需要修改您的用户模型以添加新字段以支持载波 gem 功能。
通常这意味着:
class User < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
end
但如果您使用 MongoDB 而不是 SQL/ActiveRecord,情况会有所不同。
您可以通过在 rails 控制台中初始化一个新对象并检查可用字段来测试这个新字段是否存在。
bundle exec rails c
u = User.new
u.(tab twice quickly to see the available options)
# You are looking for the avatar field
u.avatar
您可以从控制台设置它以使用它进行测试
File.open('somewhere') do |f|
u.avatar = f
end
最后,一旦您测试了它,您就可以将它添加到视图中的表单字段中。您通常为您的用户提供一个 CRUD,因此在视图中的 Create/Update 表单中,您修改这些表单以包含一个文件表单(这是 HTML 而不是专门的 rails,因此您可以在搜索中使用 HTML 查找更多信息),添加后,您需要修改相应的控制器以将该值列入白名单,以便可以使用这些控制器操作保存它。
该过程类似于在初始生成用户模型后向用户对象添加其他字段。
【讨论】:
通常,omniauth 将返回仅与身份验证有关的标准答案,基本上是由email、name/first/last、profile_picture url、username 等组合而成的哈希值。有些提供商会给您电子邮件,而其他提供商则不会't,如果您通过范围专门要求它们,其他人只会提供一些字段。
对于 facebook,我在我的 omniauth.rb 上使用以下内容(在 config/initializers/* 内)
provider :facebook, ENV['FB_ID'], ENV['FB_SECRET'], scope: 'public_profile, email, manage_pages, user_friends', info_fields: 'id, first_name, last_name, link, email', image_size: 'large'
这意味着 Facebook 将在成功的 oauth 授权后向我提供一封电子邮件、一些基本信息,例如 ID、名字和姓氏在响应哈希(omniauth 负责安排)上。它将提供的令牌也将用于管理页面,尽管我最初并没有要求任何与之相关的字段。
因此,在您的情况下,您会要求city、country 以及info_fields 中的任何内容(通过他们的图形浏览器仔细检查这些字段您不需要任何额外的范围)。
在您通过omniauth(基本上是一段编写为中间件的代码,为您执行oauth2 流程——您也可以自己完成)获得响应后,您将获得一个个人资料图片网址。 你会想要下载那张照片。 使用carrierwave,您可以在控制器或模块/类上通过实例化您设置上传器的列然后执行方法.download!将下载地址传递给它:
user.avatar = AvatarUploader.new
user.avatar.download! omniauth_hash['blabla_fields']['blabla_picture_url']
这将下载一个远程图片网址并将其保存为常规载波附件,然后您可以通过您的模型正常访问。
【讨论】: