该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-21
说ruby是怪异的语法有点不妥当,动态语言里面不乏这样的语法出现。但是看了一些源码后发现,使用ruby的用法真的各有不同,就像大家以前说的,ruby每个人写出来的可能都不同。 现来说Rails里面如何加载config的吧。 在java里面config绝对是一个resource文件,然后通过读取配置的工具加入进来,在分析处理。 在ROR里面完全不是这么回事。 1.首先大家要了解的是,在我们启动 ruby script/server 的时候,rails做了一系列的处理,最后他执行了environment.rb ruby 代码
这里的config其实是Initializer内部的一个变量,掌控全局的配置信息,我们可以使用这个config来配置我们想要的。Rails::Initializer.run的源码是这样的,yield再一次显示了他的威力,让我们在配置文件中得以配置config。然后实例化了一个initializer 之后,把config作为参数传入了。 ruby 代码
我们接着往下走,可以看到initializer 做了一系列的初始化工作,包括load_path的设定,路由的初始化,和activerecord的初始化。我们关心的还是配置如何起作用,那么来看看environments目录下面的配置文件是如何导入的吧。 ruby 代码
IO.read(configuration.environment_path) ,,这里就不使用什么回调不回调了,而是干脆IO拿出来eval一把,这里也是吃了一惊,这样也可以呀~~~~~~~然后,我们可以看看,他处理常量的方法,把自己配置文件中的常量全部放入Object里面,起到全局常量的目的。 最绝的还是initialize_framework_settings,使用了有一个ruby的技巧。 ruby 代码
configuration.frameworks里面存放的是rails个个组件的名字,比方说active_record之类。然后把这个名字大写转换,然后用constantize取得ActiveRecord这个Module(注意,这些东西都在activesupport里面呢,activesupport/lib/active_support/core_ext/string/inflections.rb )。然后用const_get取得这个模块的Base类,也就是ActiveRecord::Base这个类了(下面都叫做Base类),所有的Rails的组件都是这个命名规则改天我们自己想要做一个Rails的组件加进来,也可以这样(但是要稍微修改一个源码)。 然后,我们吧config里面的内容给Base类。configuration.send(framework)是调用一个组件名称的方法,比方说active_record,就是去的config里面的active_record属性(这是最基本的),通过后面的do我们可以看到config返回的是一个hash,然后把hash中每一个key作为变量,value为传入值,传入Base类。。。这里大家应该没什么问题了,看看我们的config文件是怎么写的吧。 ruby 代码
哦,看着很晕吧,config就是我们的配置对象,按照我们上面的说法,config.action_view之类framework的变量应该是一个hash才对呀,如果是hash的话,不应该用这样的方式传入,可能会用 config.action_view = {:debug_rjs => true}来传入。 OK.我们来看这个变量到底是什么样的hash。 ruby 代码
在初始化这些变量的时候,Rails给他赋值为OrderedOptions.new。这个特殊的类型可能就是关键。 ruby 代码
看到其中的玄妙了么,method_missing~~~!! 如果调用一个**=的方法 ,就像当用传入一个HASH的值,key就是方法的名字。 也就是:config.action_view.debug_rjs = true 相当于config.action_view[:debug_rjs] = true OK ,大体上描述了一下,可以看到简单的一个Rails初始化已经给我们展示了几乎全部ruby的靓丽之处,这能说明,这个亮点肯定是贯穿rails的基本,在以后的深入研究中我们就能看到了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-21
method_missing是个亮点。eval也很灵活。用编程的方式进行配置挺好。差沙好文呀。
|
|
返回顶楼 | |
发表时间:2006-11-21
发挥到极致了。
|
|
返回顶楼 | |
发表时间:2006-11-22
写得很好阿,学习
|
|
返回顶楼 | |
发表时间:2006-11-22
Give me a reason why this is superior than java properties file? Is it pragmatic? Is it necessary?
|
|
返回顶楼 | |
发表时间:2006-11-22
I never said this is superior than java properties file.
I only want to show the Rails Way. |
|
返回顶楼 | |
发表时间:2006-11-22
差沙 写道 I never said this is superior than java properties file.
I only want to show the Rails Way. Sorry, I am not saying you are not pragmatic. I mean is there anyone can give me a good reason this is way can bring me more value than java way? |
|
返回顶楼 | |
发表时间:2006-11-22
哇塞,
都开始飙英文, 好样的,学习下, 继续 |
|
返回顶楼 | |
发表时间:2006-11-22
没办法,本来我也想用英语回复的,但是我的系统上没有“英语输入法”,呵呵~!
|
|
返回顶楼 | |
发表时间:2006-11-22
mafa 写道 没办法,本来我也想用英语回复的,但是我的系统上没有“英语输入法”,呵呵~! 俺不是想飙英文,上班用客户机器,没有中文输入法。
|
|
返回顶楼 | |