2017-05-16 7 views
0

何らかの理由で私のhgetがパブリックメソッドで設定したハッシュを見つけたり返したりしていない。なぜ私は理解できません。プライベートメソッドのHGETがハッシュを返さない

これは私が私のRedisの初期化子を定義する場所である、すべてのApplicationControllerから継承する一方のコントローラである:

def redis 
    Thread.current[:redis] ||= Redis.new 
end 

はその後、私のコントローラで私はハッシュを設定するには、次の操作を行います。

def return_customer 
    email = params["email"] 
    customer = Customer.find_by(email: email) 
    credit_amount = customer.credit_amount.to_f 
    customer_data = {email: email, customer_id: customer.id, credit_amount: credit_amount} 
    redis.hset("shop:#{customer.shop.id}:customer", customer_data, customer_data.inspect) 
    render json: customer 
end 

そして、最後に私は同じコントローラ内の他のメソッドで使うプライベートメソッドを持っています。これは動作しない部分です:

private 

def get_customer_from_redis 
    shop = Shop.find_by(shopify_domain: params["shop"]) 
    customer_info = redis.hget("shop:#{shop.id}:customer", customer_data) 
    eval(customer_info) 
end 

これは

TypeError (no implicit conversion of nil into String): 

答えて

1

を返されるエラーである私はむしろ、このような.inspect使用.to_jsonを使用するよりも、あなたをお勧めします:あなたの秘密の方法で、その後

def return_customer 
    email = params["email"] 
    customer = Customer.find_by(email: email) 
    credit_amount = customer.credit_amount.to_f 
    customer_data = {email: email, customer_id: customer.id, credit_amount: credit_amount} 
    redis.set("shop:#{customer.shop.id}:customer", customer_data.to_json) 
    render json: customer 
end 

そして

def get_customer_from_redis 
    shop = Shop.find_by(shopify_domain: params["shop"]) 
    customer_info = redis.get("shop:#{shop.id}:customer", customer_data) 
    JSON.parse(customer_info) if customer_info 
end 
+0

うん、 'inspect'はRuby特有の形式であり、簡単かつ安全に逆シリアル化できるものではありません。 JSONははるかに優れています。 – tadman

+0

ありがとう..まだ動作していない..私はこのエラー.. "TypeError(文字列にnilの暗黙の変換なし):" – ToddT

+0

@ToddT私の答えを更新しました。 customer_infoがnilになる可能性があるため、get_custom_from_redisメソッドはエラーをスローしません。あなたは今それを試してみてください。 – DjezzzL

関連する問題