我是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
所以我的问题是,实现这一目标的好方法是什么?我已经谷歌搜索了一段时间但最终徒劳无功。你能帮帮我吗?谢谢!
答案 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
下的文件。