我是Ruby的新手。我有一个rails应用程序,我在数据库中保留了站点配置(如站点名称)。我已经设置了一个帮手,所以我可以打电话给:site_param 'site_name'
。帮助程序将数据存储在变量中,以便应用程序在每次调用时都不会访问数据库,具体如下:
module SiteHelper class Site def self.get(param) @params = {} unless @params.kind_of?(Hash) if @params[param].nil? new_param = Site.find(param) @params[param] = new_param end @params[param] end end end
现在的问题是,@params
存储了一个值后,它就不会刷新下一个请求。来自php背景,这种单例在每次请求时都会刷新,所以如果我在数据库上编辑一个值,它会被刷新而没有问题。在ruby中,@params
被缓存并保持相同的值,直到我重新启动服务器。有没有办法让@params
仅用于请求生命周期并在下一次刷新?
答案 0 :(得分:2)
您的代码的问题在于您在类的上下文中使用实例变量,因此只要进程正在运行,它就会一直存在。
您需要将#get
转换为实例方法,并重用Site
类的实例。你在Ruby中写的内容肯定不是类似单例的实现。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params = {} unless @params.kind_of?(Hash)
if @params[param].nil?
new_param = Site.find(param)
@params[param] = new_param
end
@params[param]
end
end
end
# In the view
site.get("whatever")
您的代码也可以改进为更红宝石风格。请注意#get
的实现,利用||=
和返回值。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params ||= {}
@params[param] ||= Site.find(param)
end
end
end