代码更短,防止重复呼叫

时间:2016-04-15 17:01:50

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

现在我的代码看起来像这样:

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一次? 谢谢

2 个答案:

答案 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),以便在方法中显示散列。