2016-04-15 11 views
1

は、今のところ私はこのようなコードを持っています。 私はそれを要求しない場合。短いコード、重複呼び出しを防ぐ

私の問題は今の方法get_access_tokenは二回呼ばであるということです。一度、私はaccess_tokenが有効であるかどうかをチェックし、もう1つはクライアントを要求するときです。

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

は、私はこれをしなければならないので、get_access_token(code)リターンの出力時に成功したエラーはどのように私はwork_with_access_token_or_request_oneに私のコードを書き換えることができ{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 

を発生した場合、または{access_code: 89283}ので、唯一の方法get_access_token度と呼ばれる?ありがとう

+0

'code'と' get_access_token(code) 'は論理的に同等ですか?それらがあれば、 'code_'で動作するものは' get_access_token(code) 'を与えても動作します。次に、コード上で 'get_access_token(self)'を呼び出す 'code.to_access_token'メソッドでモンキーパッチを適用し、アクセストークンで呼び出されたときに単に' return self 'を実行します。コードは内部的にトークンをキャッシュすることができます(または呼び出し側が 'to_access_token'を呼び出すことができます)。その2つのメソッドは' result = code.to_access_token'と言って、与えられたものに気を付けません。すべてが文字列とハッシュだけであれば、醜いかもしれません。 –

+0

読者は大部分が大人なので、特定の単語やフレーズを太字にする必要はありません。 –

答えて

1

これらのメソッドは1つのクラスに属しているようです。その後、あなたはそうのようなあなたのget_access_token方法キャッシュに結果を書き換えることができます:それcodeの有効期限が切れるはずです

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

場合は、同様にあなたのメソッド内でそのロジックを追加することができます。

+0

申し訳ありませんが、この特定のコードでは、クラス変数を使用できません。あなたに感謝します。別のアイデアがありますか? –

+0

John、 '@ access_token_cache'はクラス変数ではなくインスタンス変数です。 '@@ access_token_cache'はクラス変数です。 –

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 

あなたがget_access_tokenを変更することができますし、何の不都合な副作用がない場合は、あなたが簡素化できます。ハッシュを指し示す変数はインスタンス変数でなければならないこと

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 

注意(@params)をハッシュするためにメソッド内で可視にする。