Ruby on rails inject方法从哈希中检索数据
我无法在我的用户模型中获取以下方法来处理从LinkedIn获取的用于用户登录的哈希(“auth”):Ruby on rails inject方法从哈希中检索数据,ruby-on-rails,Ruby On Rails,我无法在我的用户模型中获取以下方法来处理从LinkedIn获取的用于用户登录的哈希(“auth”): def self.deep_get auth, *fields auth.inject(auth) { |acc, e| acc[e] if acc } end 稍后在我的用户模型中,当我使用omniauth/linkedin gem创建用户时,我调用了“deep_get”方法。但是,它会为provider/uid/headline/email用户字段返回nil值,我知道这些字段不是n
def self.deep_get auth, *fields
auth.inject(auth) { |acc, e| acc[e] if acc }
end
稍后在我的用户模型中,当我使用omniauth/linkedin gem创建用户时,我调用了“deep_get”方法。但是,它会为provider/uid/headline/email用户字段返回nil值,我知道这些字段不是nil
我以first_name和last_name字段为例,因为这种方法有效(不返回nil值),但(正如我所意识到的)错误的样式/异常处理。关于为什么我的deep_get inject方法不能按照我的要求检索散列中的数据,有什么想法吗
def self.create_from_omniauth(auth)
create! do |user|
# i'd like to retrieve user information from linkedin per the following with my inject method, but i am getting nil values when i should be getting data.
# :provider and :uid are on the same branch level of data. first_name,last_name,email,etc. are on a branch just below called 'info'
user.provider = deep_get(auth, :provider)
user.uid = deep_get(auth, :uid)
user.headline = deep_get(auth, :info, :headline)
user.email = deep_get(auth, :info, :email)
# the below is working but i know pokemon exception handling is not good style.
begin
user.first_name = auth["info"]["first_name"]
rescue
end
begin
user.last_name = auth["info"]["last_name"]
rescue
end
试试这个
def deep_find(obj,key)
if obj.respond_to?(:key?) && obj.key?(key)
obj[key]
elsif obj.respond_to?(:each)
r = nil
obj.find{ |*a| r=deep_find(a.last,key) }
r
end
end
or try this
class Hash
def deep_fetch(key, default = nil)
default = yield if block_given?
(deep_find(key) or default) or nil
end
def deep_find(key)
if key?(key)
self[key]
else
self.values.inject(nil) do |memo, v|
memo = v.deep_find(key) if v.respond_to?(:deep_find)
memo unless memo.nil?
end
end
end
end