2017-05-16 3 views
0

Ein Grund, meine hget ist nicht finden oder einen Hash zurückgeben ich in einer öffentlichen Methode festgelegt. Ich kann nicht herausfinden warum.HGET in privaten Methode nicht zurückgeben Hash

Dies ist alles in einem Controller, der von ApplicationController erbt, die, wo ich meine redis initializer definieren ist:

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

Da ist in meinem Controller mache ich das den Hash zu setzen:

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 

Dann habe ich schließlich diese private Methode, die ich in anderen Methoden in der gleichen Steuerung verwende, das ist der Teil, der nicht funktioniert:

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 

Dies ist der Fehler, die

TypeError (no implicit conversion of nil into String): 

Antwort

1

ich Sie empfehlen würde eher zurückgegeben wird als die Verwendung von .inspect Verwendung .to_json wie folgt aus:

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 

Und dann in Ihrer privaten Methode

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

Ja "inspect" ist ein sehr Ruby-spezifisches Formular und kann nicht einfach und sicher deserialisiert werden. JSON ist viel besser. – tadman

+0

danke .. es funktioniert immer noch nicht .. Ich bekomme diesen Fehler .. "TypeError (keine implizite Umwandlung von Nil in String):" – ToddT

+0

@ToddT Ich aktualisierte meine Antwort. Die Methode get_custom_from_redis wirft jetzt keinen Fehler, da customer_info null sein kann. Könnten Sie es bitte jetzt versuchen? – DjezzzL

Verwandte Themen