2016-04-15 1 views
1

Im Moment habe ich einen Code, der wie folgt aussieht:Kürzere Code, verhindern duplizierten Anruf

def work_with_access_token_or_request_one 
    if is_valid_access_token?(params[:code]) 
     request_client_with_access_token(params[:code]) 
    else 
     request_access_token! 
    end 
end 

Bei diesem Verfahren I erste Prüfung, wenn der Code, den ich in den params bekommen gültig ist. Wenn nicht, fordere ich eins an.

Mein Problem ist, dass gerade jetzt die Methode get_access_token ist zweimal genannt. Einmal wenn ich überprüfe ob das access_token gültig ist und das andere mal wenn ich den Client anfrage.

def get_access_token(code) 
    return Okto.request_access_token_from_code(code) 
end 

Ich habe, dies zu tun, weil die Ausgabe von get_access_token(code) kehrt zurück, wenn erfolgreich {access_code: 89283} oder wenn ein Fehler {error: "not valid"}

def is_valid_access_token?(code) 
    result = get_access_token(code) 
    return result[:access_code] 
end 

def request_client_with_access_token(code) 
    result = get_access_token(code) 
    client = Okto.get_client_from_access_code(result[:acess_code]) 
end 

aufgetreten Wie kann ich meinen Code in work_with_access_token_or_request_one umschreiben, so dass nur ein einziges Mal die Methode get_access_token wird genannt? Danke

+0

Sind 'code' und' get_access_token (code) 'logisch äquivalent? Wenn sie dann sind, sollte alles, was mit einem 'Code' arbeitet, auch funktionieren, wenn 'get_access_token (code)' angegeben wird. Dann könnten Sie in einer 'code.to_access_token'-Methode, die' get_access_token (self) 'auf einem Code aufruft und eine" self-Funktion zurückgibt ", wenn sie auf einem Zugriffstoken aufgerufen wird, einen Patch ausführen. Dann könnten Codes das Token intern zwischenspeichern (oder der Aufrufer könnte 'to_access_token' aufrufen) und diese beiden Methoden würden einfach' result = code.to_access_token' sagen und es wäre egal, was sie bekommen. Könnte hässlich sein, wenn alles nur Strings und Hashes sind. –

+0

SO Leser sind meist Erwachsene, so dass Sie bestimmte Wörter und Sätze nicht fett stellen müssen. –

Antwort

1

Es sieht so aus, als ob diese Methoden zu einer einzigen Klasse gehören. Dann könnten Sie Ihre get_access_token Methode Cache die Ergebnisse wie so umschreiben:

def get_access_token(code) 
    @access_token_cache ||= {} 
    @access_token_cache[code] ||= Okto.request_access_token_from_code(code) 
    @access_token_cache[code] 
end 

Wenn die code ablaufen soll, dann können Sie diese Logik innerhalb Ihrer Methode als auch hinzufügen.

+0

Sorry, aber in diesem spezifischen Code kann ich keine Klassenvariable verwenden. Danke für dich. Hast du vielleicht eine andere Idee? –

+0

John, '@ access_token_cache' ist eine Instanzvariable, keine Klassenvariable. '@@ access_token_cache' ist eine Klassenvariable. –

1
def access_token(code) 
    h = get_access_token(code) 
    h.key?(:access_code) ? h[:access_code] : nil 
end 

def work_with_access_token_or_request_one 
    result = access_token(@params[:code]) 
    result ? request_client_with_access_token(result) : request_access_token! 
end 

Wenn Sie get_access_token und es gibt Effekt keine unerwünschten Neben ändern können, könnten Sie vereinfachen:

def get_access_token(code) 
    h = Okto.request_access_token_from_code(code) 
    h.key?(:access_code) ? h[:access_code] : nil 
end 

def work_with_access_token_or_request_one 
    result = get_access_token(@params[:code]) 
    result ? request_client_with_access_token(result) : request_access_token! 
end 

Beachten Sie, dass die Variable zeigt auf dem Hash muss eine Instanz variabel sein (@params) für den Hash innerhalb der Methode sichtbar sein.