如何处理不提供某些价值的Facebook用户?我正在使用考拉宝石和omniauth。
我收到以下错误:
NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass
app/models/user.rb:14:in `block in from_omniauth'
app/models/user.rb:5:in `tap'
app/models/user.rb:5:in `from_omniauth'
app/controllers/sessions_controller.rb:3:in `create'
我得到了这个错误,因为facebook用户我的应用程序正在尝试使用我的应用程序想要的一些数据值,如位置,教育历史等。
一个新的用户进程,在SessionsController中结束:
class SessionsController < ApplicationController
def create
user = User.from_omniauth(env['omniauth.auth'])
session[:user_id] = user.id
redirect_to root_url, notice: "Signed in!"
end
end
然后在用户模型中:
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"] unless auth["info"].blank?
user.first_name = auth["info"]["first_name"] unless auth["info"].blank?
user.last_name = auth["info"]["last_name"] unless auth["info"].blank?
user.image = auth["info"]["image"] unless auth["info"].blank?
user.email = auth["info"]["email"] unless auth["info"].blank?
user.gender = auth["extra"]["raw_info"]["gender"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank?)
user.location = auth["extra"]["raw_info"]["location"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank? && !auth["extra"]["raw_info"]["location"].blank?)
user.token = auth["credentials"]["token"] unless auth["credentials"].blank?
# highschool data
user.highschool_name = auth["extra"]["raw_info"]["education"][0]["school"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][0]["school"].blank?)
user.highschool_year = auth["extra"]["raw_info"]["education"][0]["year"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][0]["year"].blank?)
# graduate school data
user.graduateschool_name = auth["extra"]["raw_info"]["education"][1]["school"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][1]["school"].blank?)
user.graduateschool_year = auth["extra"]["raw_info"]["education"][1]["year"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][1]["year"].blank?)
user.add_friends
user.save!
user
end
end
end
答案 0 :(得分:1)
您也可以使用Object.try方法。
user.first_name = auth["info"].try(:[], "first_name")
但最好的方法应该是
unless auth["info"].blank?
user.first_name = auth["info"]["first_name"]
user.last_name = auth["info"]["last_name"]
user.image = auth["info"]["image"]
user.email = auth["info"]["email"]
end
答案 1 :(得分:0)
错误在第14行中为您提供用户模型文件,例如,如果auth["credentials"]
为nil auth["credentials"]["token"]
,则会出现相同的错误。
在分配值时将检查排成一行,例如user.token = auth["credentials"]["token"] unless auth["credentials"].blank?
更新
user.first_name = auth["info"]["first_name"] unless auth["info"].blank?
user.last_name = auth["info"]["last_name"] unless auth["info"].blank?
user.image = auth["info"]["image"] unless auth["info"].blank?
user.email = auth["info"]["email"] unless auth["info"].blank?
user.gender = auth["extra"]["raw_info"]["gender"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank?)
user.location = auth["extra"]["raw_info"]["location"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank? && !auth["extra"]["raw_info"]["location"].blank?)
user.token = auth["credentials"]["token"] unless auth["credentials"].blank?