Rails 怎么样才能只读取一次 YAML 文件

rubybird · 2013年02月20日 · 最后由 rubybird 回复于 2013年02月25日 · 6334 次阅读

想用 YAML 来设置一些简单的信息,如站点名称。希望能在启动 Rails 的时候就把 YAML 的配置信息读取处理,以后每次用户访问时就直接从内存访问,而不需要再次从磁盘读取。现在的问题是,我的读取函数应该放在哪里,才能确保只执行一次呢

CONFIG = YAML.load_file(......) 放在 inititalizer 里好了 以后只要用 CONFIG 就能读取到内存里的配置信息了。。

在 lib 目录下写个类封装一下在调用,yaml 放在 config 目录下就好了

笨办法:

$a = YAML.load_xxx if not defined? $a

#4 楼 @sevk 这个方法看起来比较优雅

我使用了 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,再第二次调用是否依然可用??

应该是在一次请求里有效吧。下一次请求还是要读文件吧。优化可以考虑 redis 或者 memcached 吧。

#8 楼 @rubybird 只要你的 rails_app 没有关闭,多次调用 site_conf 依然有用,你可以把 @confobject_id 显示出来,这样就可以知道每次是不是都是同一个 object 了。

#10 楼 @neverlandxy_naix 第一次打开页面,得到的 object_id 是 33495240 第二次刷新页面,得到的 object_id 是 35038600

呵呵,有啥优化方法?

#9 楼 @chenge 有没有具体点的?

redis 和 memcached 就是常驻内存的,你搜索下吧,有些复杂,不是几句话能说清的。

#11 楼 @rubybird 你把这个 object 放在application_controller里面啊... 放在其他的 action 里面肯定不行,相当于浏览器又一次发出了请求给应用程序,浏览器与应用程序之间交流用的协议是无状态的,没有内建的记忆机制。

#13 楼 @neverlandxy_naix application_controller 有什么特别的么?似乎没有吧。

#14 楼 @chenge 你多次刷新的时候是不会发送请求给application_controller这个文件里面的action的。比如说你刷新主页,浏览器发送的请求经过路由就直接到了home_controller里面的homeaction,相当于再次执行了 home 方法,而浏览器与 app 之间的协议无状态,所以就不知道你之前是不是已经请求过homeaction。所以object_id就不同了。

#11 楼 @rubybird

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 有智能判断对象内容是否变化了。

#8 楼 @rubybird 用类变量@@config @chenge Fixnum 对象前多少个是预先分配的,有点像 symbol,所以 1.object_id 不会变

#18 楼 @jjym @@config 确实不会变,谢谢!

#18 楼 @jjym 这个似乎是优于 php 的地方。ruby 是常驻内存的,php 每次请求都要重新初始化,必须借助 memcached。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号