缓存http调用导致rails

时间:2017-06-24 09:07:26

标签: ruby-on-rails ruby caching

我是rails的新手并且遇到了这个问题。

我想做的事情是: 我需要调用服务A来检索idA然后我使用idA来执行其他操作。我在控制器中的动作类似于

class SomeController < ApplicationController
  def someAction
    idA = getIdAfromServiceA(config)
    doSomethingElseToServiceB(idA)
  end
end

由于serviceA的结果仅依赖于config,因此一旦加载了配置,idA就不应该改变。因此我想缓存idA。

我尝试使用实例变量来缓存它,没有运气(&#34;调用getIdAfromServiceA被打印&#34;在每个请求上)

class SomeController
  def getIdAfromServiceA(config)
    @IdA ||= getIdAfromServiceAviaHTTP(config)
  end

  private
  def getIdAfromServiceAviaHTTP(config)
     puts "getIdAfromServiceAviaHTTP is called"
     #make some http call
  end
end

我还尝试将其放入application.rb以在启动时缓存它。它显示错误:undefined method 'getIdAfromServiceAviaHTTP' for SomeHelper:Module (NoMethodError)

module MyProject
  class Application < Rails::Application
    config.load_defaults 5.1
    require_relative 'relativePathToSomeHelperModule'
    config.idA  = SomeHelper.getIdAfromServiceAviaHTTP(config)
  end
end

所以我的问题是,实现这一目标的好方法是什么?我已经谷歌搜索了一段时间但最终徒劳无功。你能帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:4)

/config/initializers/下创建一个ruby文件并将该代码放在那里。

选项1:

# config/initializers/ida_from_api.rb

IDA = SomeHelper.getIdAfromServiceAviaHTTP(config)

然后,您可以在整个申请中使用IDA

选项2:

# config/initializers/ida_from_api.rb

Rails.configuration.idA = SomeHelper.getIdAfromServiceA(config)

然后,您可以在整个应用程序中使用Rails.configuration.idA。查看Custom configuration了解详情。

仅供参考 - 应用程序启动时加载initializers下的文件。