现在我的代码看起来像这样:
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
在这种方法中,我首先检查,如果我在参数中得到的代码是有效。 如果不是,我请求一个。
我的问题现在,方法get_access_token
被调用两次。一旦我检查access_token是否有效,另一次我请求客户端。
def get_access_token(code)
return Okto.request_access_token_from_code(code)
end
我必须执行此操作,因为get_access_token(code)
的输出会在成功{access_code: 89283}
时返回,或者如果发生错误{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
如何在work_with_access_token_or_request_one
中重写我的代码,以便只调用方法get_access_token
一次? 谢谢
答案 0 :(得分:1)
看起来这些方法属于单个类。然后,您可以将get_access_token
方法重写为缓存结果,如下所示:
def get_access_token(code)
@access_token_cache ||= {}
@access_token_cache[code] ||= Okto.request_access_token_from_code(code)
@access_token_cache[code]
end
如果code
到期,那么您也可以在方法中添加该逻辑。
答案 1 :(得分: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
),以便在方法中显示散列。