0

LinkedInからユーザーサインイン用に取得しているハッシュ(「auth」)を処理するために、ユーザーモデルで以下のメソッドを取得するのに問題があります。

def self.deep_get auth, *fields
    auth.inject(auth) { |acc, e| acc[e] if acc }
end

omn​​iauth / LinkedIn gemを使用してユーザーを作成するときに、ユーザーモデルの後半で「deep_get」メソッドを呼び出します。ただし、プロバイダー/ uid / headline/emailのユーザーフィールドにはnilではないことがわかっているnil値が返されます。

このアプローチは機能している(nil値を返さない)ため、例としてfirst_nameフィールドとlast_nameフィールドを含めましたが、(私が理解しているように)スタイル/例外処理が不適切です。私のdeep_getinjectメソッドがハッシュ内のデータを取得するために機能していない理由についてのアイデアはありますか?

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
4

1 に答える 1

0

これを試して

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
于 2012-09-17T14:17:10.970 に答える