http://blog.csdn.net/saint1126/archive/2010/04/29/5541171.aspx
《
Rails
高级编程》前言介绍说这不是为初学者准备的,读者应该对
web
构架有所了解,很好的掌握
ruby1.8
,有使用
ruby on rails
的网站开发经验。还推荐了一些读者本书之前应该读的一些图书。作者推荐的下面几本书都是
很不错的,不过有些还没看。
1
、《
Programming
Ruby
》,第
2
版,之前看类和模块的部分。
2
、《
The
Ruby Programming Language
》
,
该书对
ruby1.8
和
ruby1.9
都做了详细的介绍,目前正在读,十分不错的一本书。
3
、《
Best
of
Ruby Quiz
》,该说选择了
25
道难题,然后给出了解决方案。
4
、《
Agile
Web Development with Rails
》,现在第三版的中文版也有了。几乎是
rails
的入门必读书籍。
5
、《
Rails
Cookbook
》,在图书馆看到了,一时看不完。等下下个月在看下。
这些都是一些学习
ruby
和
rails
的参考书籍,十分优秀的著作。自己以前都是用东西,上网查,很不系统,读书的乐趣就在于
能够告诉你理论,从理论的角度出发去解决问题,是一种“授人以渔”。
书归正传,本书开
始讲解的是
ruby
的一些基本知识。看了下,就当是复习了,不过收获还是挺大的,温故而知新。
从学习
rails
开始,总是学习
ruby api
,
rails api
之类的,不太了解
rails
的运行的各个步骤,不能高屋建瓴的统筹下,
api
在熟练总觉得缺点什么,不能达到收放自如的地步。因此,我一直想找一些
rails
应用程序初始化和运行过程的资料,系统的了解和认识下,并试着自己去亲手配置,学习下。
先看下
initializer.rb
文件,
Rails::Initializer
是用
ruby
处理
Rails
环境设置初始化的主类。应用的初始化是从
config/environment.rb
开始的,它包含了这样的
block:
Rails::Initializer.run
do |config|
#
end
Rails::Initializer.run
生成一个新
Rails::Configuration
对象到
block
中。接着
run
方法创建一个新的
Rails::Intializer
对象,并调用
process
方法,该方法执行下面的步骤来初始化
Rails
:
1.
check_ruby_version:
确保使用的是
1.8
以上
2.
set_load_path:
将框架路径加载到
ruby
加载路径中,如果说存在的话即存在,
vendor/rails
或者
RAILS_FRAMEWORK_ROOT
,如果使用的是
ubuntu
操作系统的话,并且采用
apt-get
安装的
ruby
和
rails
系统会在每个的
rails
应用程序的
vendor
目录下会有一个
rails
的文件。
3.
require_framework:
加载在
frameworks
配置选项中列出的每个框架,如果没有则认为是
RubyGems
安装的。
4.
set_autoload_paths:
根据配置变量
load_paths
和
load_once_paths
设置自动加载路径。参数与第二步一致,用于处理未知变量和方法的时候。
5.
load_enviroment:
加载并执行环境相关(
development,product,test
)配置文件
6.
initialize_encoding:
设置
$KCODE
为
u
来使得整个
Rails
支持
UTF-8
7.
initialize_database:
如果使用了
ActiveRecord
,设置它的数据库配置,并连接到相应的数据库服务器。
8.
initialize_logger:
设置成
logger
,将顶级的
RAILS_DEFAULT_LOGGER
设置到该实例,如果在配置中指定
logger
就使用它,如果没有,就会创建一个新的
logger
并定向到
log_path
指定的那个,如果失败了,会显示一个警告,并把
log
重定向到标准错误输出。
9.
initialize_framework_logging:
把
ActiveRecord
,
ActionController
,
ActionMailer
设置成刚刚初始化的
logger
。
10.
initialize_framework_views:
把
ActionController
和
Action Mailer
设置
view_path
值,代表了视图路径。
11.
initialize_dependency_machamism:
基于
cache_classes
配置项的值,来设置
Dependencies.mechaism(
他决定了是用
require
还是
load
来加载文件
)
,那好来看下
require
和
load
的区别吧:
require,load
用于文件,如
.rb
等等结尾的文件,
require
一般情况下用于加载库文件,而
load
则用于加载配置文件,
require
加
载一次,
load
可加载多次。
12.
initialize_whiny_nils:
如果
Whiny_nils
配置项设置为
true
,就会给
NilClass
添加
Whiny Nil
扩展(对
nil
上调用
id
或其他方法时他会抱怨)
13.
initialize_temporay_directories:
设置
ActionController
的临时
session
和
cache
目录,如果他们存在文件系统中。
14.
initialize_framework_settings:
将框架特定的配置项转换到框架
Base
类的方法调用上。例如,考虑这样的配置选项
:
config.active_record.schema_format
=:sql
,
config.active_record
对象是一个
Rails::OrderedOptions
的实例,他从根本上是个有序
hash
(目的是让配置保持顺序)。在初始化期间,
initialize_framework_settings
方法将他转化成为下面的形式:
ActiveRecord::Base.sechema_format
= :sql
15.
add_support_load_paths:
给支持的功能添加加载路径。
16.
load_plugins:
从
plugins
配置项指定的路径加载插件(默认从
vendor/plugins
)。如果指定了一个
plugins
的配置项,就按它指定的顺序加载插件,加载
plugin
是在接近整个进程的尾声时进行的,所以他们可以覆盖已加载的插件。
17.
load_observers:
实例化
ActiveRecord
的
Observers
。他是加载完
plugin
之后要做的,因此
plugin
有机会修改这些
observer
类。
18.
initialize_routing:
加载处理
routes
,并根据
controller_paths
配置项设置
Controller
路径
19.
after_initialize:
调用所以用户自定义的
after_initialize
回调,这些回调是在
config.after_initialize{…}block
里定义的。
20.
load_application_initializers:
加载所有的
RAILS_ROOT/config/initializers
及其子目录的
ruby
文件。
至此为止,
rails
已经准备好请求了。