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 已经准备好请求了。