我们使用的是Rails 3.0.6。
以下代码会在Rails中的页面加载和用户之间持续存在吗?还是每次请求都会被重新定义?代码位于控制器的顶部。
@@list = []
hero = {}
hero['name'] = 'so'
hero['superpowers'] = ['coding', 'qa', 'spec_writing']
@@list.push hero
hero2 = {}
hero2['name'] = 'so2'
hero2['superpowers'] = ['coding']
@@list.push hero2
... more Hashes pushed into @@list该列表每月只更改一次,我们希望能够高效、快速地将此数据提供给页面请求。我们最终将使用Rails.cache从数据库中读取数据,但现在我们使用以下方法(假设它可以工作)。
发布于 2012-04-09 23:13:26
在开发中,默认行为是在每次请求时重新加载类,从而重置类变量。然而,在生产中,该类被初始化一次,因此类变量将在多个请求和多个会话中持久存在。
你应该尽快转向一种合适的缓存技术。显然,当应用程序重新启动时,您不能在重新加载类之后持久化该值。此外,如果web服务器是多线程的(很可能是这样),它可能会在不共享类变量的不同线程上运行应用程序的多个实例,这可能会在请求之间产生不一致。
发布于 2012-10-15 23:17:02
我刚刚遇到了同样的问题,并找到了这篇文章。我知道这是一个老问题,但发布我的答案是为了以防其他人遇到类似的问题……
我认为对于由于某种原因不能使用数据库或Rails.cache的情况,最好的位置是应用程序类。只需定义一些属性并对其进行初始化。这样就可以像访问Rails.application.heros.一样轻松地访问它下面是一个简单明了的示例:
在config/application.rb中
module YourRailsApp
class Application < Rails::Application
attr_reader :heros
initializer "init heros" do
@heros = []
hero = {}
hero['name'] = 'so'
hero['superpowers'] = ['coding', 'qa', 'spec_writing']
@heros.push hero
hero2 = {}
hero2['name'] = 'so2'
hero2['superpowers'] = ['coding']
@heros.push hero2
end
#Other application sutff...
end
end发布于 2012-04-09 23:13:38
我有时会使用我称之为的东西,即可怜的的缓存。
它的工作原理如下:
在初始化器中,添加:MY_CACHE_HASH = {}
MY_CACHE_HASH[:foo] = :bar
MY_CACHE_HASH[:foo] #=> :bar我不推荐这样做:如果你的服务器崩溃了,你会怎么做?
https://stackoverflow.com/questions/10075167
复制相似问题