通过Rails 5.2.1初始化程序,我将customers.json
导入到无表模型中,而没有使用任何DB功能。此JSON数据需要在Rails启动时一次加载到内存中,然后根据需要在整个应用程序中进行访问。应用重新启动后,会重新加载。
我到目前为止所做的:
initializers/json_loader.rb
data = JSON.parse(File.read('tmp/customers.json'), symbolize_names: true)
JSONDatastore.new(data) # load into model
app/models/json_datastore.rb
class JSONDatastore
def initialize(records)
@records = records
end
def self.records
return @records
end
end
问题:当我这样做时,在控制器中,我无法掌握在初始化程序中设置的已填充JSONDatastore实例。它在初始化程序中填充了JSON数据,但是当我尝试通过调用JSONDatastore.records
在其他控制器中的某个位置访问它时,即使设置了nil
config.cache_classes = true
我是否可以获取填充在初始化器中的JSONDatastore
实例并在控制器中访问它?我尝试使模型成为单例,并且可以通过JSONDatastore.instance
获取实例,但是@records
又是nil
。
答案 0 :(得分:1)
您应该清楚地了解类范围和实例范围之间的区别。您的records
是一个返回 class实例变量的类方法。您在initialize
中设置的是 instance变量。它们具有相同的名称,但没有共同点。
改为设置您的类实例变量。
class JSONDatastore
def self.assign(records)
@records = records
end
def self.records
@records
end
end
然后致电JSONDatastore.assign
而不是new
。
如果您仍然在滥用初始化程序来设置类实例变量后仍然这样做,则可以这样做:
def initialize(records)
self.class.instance_variable_set(:@records, records)
end