【发布时间】:2017-11-27 19:41:39
【问题描述】:
我是 Rails 新手,遇到了这个问题。
我想做的是: 我需要调用服务 A 来检索 idA,然后使用 idA 执行其他操作。我在控制器中的操作类似于
class SomeController < ApplicationController
def someAction
idA = getIdAfromServiceA(config)
doSomethingElseToServiceB(idA)
end
end
由于 serviceA 的结果只依赖于 config,一旦 config 被加载,idA 应该不会改变。因此我想缓存 idA。
我尝试使用实例变量来缓存它,没有运气(“getIdAfromServiceA is called is called is printed”)
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
所以我的问题是,实现这一目标的好方法是什么?我已经在谷歌上搜索了一段时间,但最终是徒劳的。你能帮我吗?谢谢!
【问题讨论】:
-
这个
IdA在整个申请过程中不会改变吗? -
是的。只有当用户更新配置时它才会改变,这需要重新启动应用程序。因此它可以在应用程序的生命周期内被视为常量
-
那么这个
idA本质上是配置的一部分,据我了解,应该这样对待 -
JFYK,ruby 中的方法命名和局部变量应该是snake_case。您可以查看其他 ruby 样式指南here。
-
@AtulKhanduri 谢谢!
标签: ruby-on-rails ruby caching