想用 YAML 来设置一些简单的信息,如站点名称。希望能在启动 Rails 的时候就把 YAML 的配置信息读取处理,以后每次用户访问时就直接从内存访问,而不需要再次从磁盘读取。现在的问题是,我的读取函数应该放在哪里,才能确保只执行一次呢?
CONFIG = YAML.load_file(......) 放在 inititalizer 里好了 以后只要用 CONFIG 就能读取到内存里的配置信息了。。
我使用了 helper 方法来实现本帖提到的这些需求
def site_conf(key)
@conf ||= YAML.load_file("#{Rails.root}/config/site.yml")
@conf[key]
end
这样,我在页面 HAML 模板中就可以这样使用了
%h1= link_to site_conf('title'), root_url
我的 YAML 文件 site.yml
title: i'm a ruby bird
现在基本能工作了,单还是有一个问题,就是 每次调用 site_conf,是不是就直接返回@conf了? 我知道
@conf ||= YAML.load_file("#{Rails.root}/config/site.yml")
是有定义就返回@conf,没有就执行后一句
但是 ruby 的变量有作用域,第一调用 site_conf 获得的@conf,再第二次调用是否依然可用??
#10 楼 @neverlandxy_naix 第一次打开页面,得到的 object_id 是 33495240 第二次刷新页面,得到的 object_id 是 35038600
呵呵,有啥优化方法?
class ApplicationController < ActionController::Base
protect_from_forgery
def test_object
@test_object ||= 1
@test_object
end
end
class HomeController < ApplicationController
def index
puts test_object.object_id
end
end
直接调用这个test_object
就行了。
#16 楼 @neverlandxy_naix 我做了实验,你的例子确实如此。但是如果换成读文件就不一样了。
似乎 ruby 有智能判断对象内容是否变化了。