译者注:本文原文来自Rails Guides,版本为January 3, 2009: First reasonably complete draft by Mike Gunderloy。本文根据原文,按照Creative Commons Attribution-Share Alike 3.0授权。
本指南涵盖了可用于Rails应用中的配置和初始化特性。通过本指南,你可以
1.调整Rails应用的行为
2.添加在应用启动阶段运行的代码
本指南的第一版是基于Rails 2.3的源代码撰写的。虽然不保证向前兼容,但是本指南涵盖的信息可广泛地用于Rails 2.2。
1. 初始化代码的位置
Rails(至少)提供了五个好位置来放置初始化代码:
- 预初始化器(preinitializers)
- environment.rb
- 针对特定环境的配置文件
- 初始化器(load_application_initializers)
- 后初始化器(After-Initializers)
2. 使用预初始化器
Rails允许你使用一个预初始化器,在框架自身被装载前来运行代码。如果你把代码存放在RAILS_ROOT/config/preinitializer.rb中,这些代码会在任何框架组件(Active Record, Action Pack, and so on)之前第一个被装载。如果你想要改变任何初始化过程中某些类的行为,你可以在这里(preinitializers文件)做。
3. 配置Rails组件
基本上来说,配置Rails所做的工作就是配置Rails自身以及配置Rails的各个组件。environments.rb文件以及针对特定环境的配置文件(比如config/environments/production.rb)允许你设定各个组件的设置。例如,默认的Rails2.3中的environment.rb文件中包含这样一条配置:
config.time_zone='UTC'
这是一条Rails自身的设置。如果你想要设定Rails的各个组件的设置,你也可以通过同样的这个config对象来做:
config.active_record.colorize_logging = false
Rails会使用这条设置来配置Active Record
3.1 配置Active Record
ActiveRecord::Base包含许多种配置选项:
3.2 配置Action Controller
ActionController::Base包含了一些配置设定:
asset_host在所有AssetHelper中的辅助方法所生成URL的前面添加一个字符串。这是设计用来将所有的javascript,CSS以及图片文件转移到一个不同的主机(asset host)上。
consider_all_requests_local通常在开发环境中被设为true而在生产环境中被设为false;如果它被设为true,则任何错误都会导致详细的调试信息会被导出到HTTP response中。如果你想做更细致的控制,将其设为false然后实现local_request?方法来决定哪些requests会在出错的情况下提供调试信息。
allow_concurrency为了允许同步(线程安全的)的action处理,该值应当被设为true。默认情况下该值为false。你通常不应当直接修改这个配置,因为你需要一系列的其他调整使得线程安全模式可以正确地工作做。你可以在production.rb文件中简单地调用config.threadsafe!,它会为你做所有需要的调整。
Threadsafe操作和开发模式下的一些功能不兼容。特别是自动的依赖装载和类重装载会在你调用config.threadsafe!之后被自动禁用
param_parsers让你可以设置一个handlers的数组,用于提取HTTP requests中的信息并将它放到params哈希中。默认情况下,multipart forms,URL-encoded forms,XML以及JSON的parsers是被激活的。
default_charset设定了所有render默认使用的字符集。默认值为"utf-8"
logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,可以被用来在Action Controller中记录日志信息。把该值设为nil会禁用日志功能。
resource_action_separator用来设置RESTful url中resource和action之间的分隔符。默认为”/”。
resource_path_names用来设置一个RESTful action默认的名字的哈希。默认情况下,new action被命名为new而edit action被命名为edit。
request_forgery_protection_token用来设置RequestForgery的参数名。调用protect_from_forgery会将它设为:authenticity_token
optimise_named_routes打开了一些生成路径表(routes table)的优化。它默认被设为true
use_accept_header用于设置确定response格式的规则。如果该值设为true(默认值),则respond_to方法和Request#format方法会根据Accept Header返回相应格式的response。弱该值设为false则request格式会单独由params[:format]来决定。如果没有format参数,则response的格式会根据request是否是一个Ajax request来决定返回HTML还是Javascript。
allow_forgery_protection用于设置启用还是禁用CSRF保护。默认在测试模式下该值为false而在其他模式下为true。
relative_url_root可以被用来告诉Rails你将会将应用部署到一个子目录。默认值为ENV['RAILS_RELATIVE_URL_ROOT']
缓存功能代码将会增加两个额外的设置:
ActionController::Caching::Pages.page_cache_directory用于设置Rails为你的Web服务器创建缓存页面的位置。默认值为Rails.public_path(通常该值被设为RAILS_ROOT“/public”+)。
ActionController::Caching::Pages.page_cache_extension用于设置生成的缓存页面文件的扩展名(如果进来的requests已经带了扩展名则这里的扩展名会被忽略)。默认值为.html。
分发器(dispatcher)包含了这样一条配置
ActionController::Dispatcher.error_file_path给定了Rails用来寻找出错文件如404.html的路径。默认值为Rails.public_path。
使用Active Record的session存储可以这样来配置
CGI::Session::ActiveRecordStore::Session.data_column_name用于设置用来存储session数据的列名。默认值为’data’。
3.3 配置Action View
Action View上只有不多的几个配置选项,从ActionView:Base的四个开始:
3.4 配置Action Mailer
ActionMailer::Base上由一系列可用的配置:
3.5 配置Active Resource
ActiveResource::Base中有一个配置可以设置:
logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,用来从Active Resource中记录日志信息。设为nil时禁用日志功能。
3.6 配置Active Support
Active Support中有一些配置选项:
配置 Active Model
Active Model目前有一个单独的配置设置:
ActiveModel::Errors.default_error_messages是一个包含所有验证错误消息的数组。
使用初始化器
在装载了框架以及任何gems和插件之后,Rails会开始装载初始化器(initializers)。一个初始化器是在你的应用中任何存储在/config/initializers中的ruby代码。你可以使用初始化器来存放哪些应该整个框架和插件装载后进行的配置设置。
如果你喜欢的话,你可以使用子目录来组织你的初始化器,因为Rails会渗入到initializers目录的整个文件目录层级中去。
如果你的初始化器有任何的顺序依赖关系,你可以通过命名来控制它们装载的顺序。例如,01_critical.rb会在02_normal.rb之前装载。
使用一个后初始化器(After-Initializer)
后初始化器(如同你所猜想的)会在所有的初始化器装载之后运行。你可以通过在任何Rails配置文件中设立config.after_intialize来支持一个after_initialize代码块(或者一个这种代码块的数组)。
config.after_initialize do
SomeClass.init
end
你应用的一部分,特别是观察者(observers)和路径(routing)在after_initialize代码块被调用时还没有建立好。
Rails环境设置
Rails的一部分配置可以通过外部环境变量来配置。以下的环境变量会被Rails的不同部分识别出来。
ENV['RAILS_ENV']定义了Rails所运行在的环境(production,development,test等等)
ENV['RAILS_RELATIVE_URL_ROOT']被路径代码用来在你部署你的应用到一个子目录时识别出URL。
ENV['RAILS_ASSET_ID']会覆写默认的Rails生成的用户可下载资产的缓存失效的时间戳。
ENV['RAILS_CACHE_ID']和ENV['RAILS_APP_VERSION']用来生成Rails缓存代码中的扩展的缓存键。这可以允许你对同一个应用有多个分开的缓存。
ENV['RAILS_GEM_VERSION]在RAILS_GEM_VERSION没有在environment.rb文件中定义时,定义了使用的Rails gems的版本。