我是 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并在下一个请求生命周期内刷新?
最佳答案
您的代码的问题是您在类的上下文中使用实例变量,因此只要进程正在运行,它就会持续存在。
您需要将#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")
您的代码也可以改进为更加 Ruby 风格。请注意 #get
的实现,利用 ||=
和返回值。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params ||= {}
@params[param] ||= Site.find(param)
end
end
end
关于ruby-on-rails - 如何清除 Ruby 中的内存缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260438/