配置Rails应用
by Xu Wenhao
译者注:本文原文来自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包含许多种配置选项:
- logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,该logger会传递给所有的新创建的数据库连接。你可以在ActiveRecord的model类或者其实例上调用logger来获取该logger。把该值设为nil会经用日志功能。
- primary_key_prefix_type用于设置主键列的命名。Rails默认主键列的名字是id(该配置无需设定),但是你可以有两个别的选择:
- :table_name会另Customer类的主键为customerid
- :table_name_with_underscore会另Customer类的主键为customer_id
- table_name_prefix使你可以在表名的前面设置添加一个全局的字符串。如果你将该值设为northwest_,那么Customer类会映射到northwest_customers表。默认该值为一个空字符串
- table_name_prefix使你可以在表明的后面设置添加一个全局的字符串。如果你将该值设为_northwest,那么Customer类会映射到customers_northwest表。默认该值为一个空字符串。
- pluralize_table_names规定了Rails使用单词的单数还是复数来命名数据库中的表名。如果该值被设置为true(默认值),那么Customer类会使用customers表,如果该值被设置为false,那么Customer类会使用customer表
- colorize_logging(默认为true)规定了在ActiveRecord的日志信息中是否使用彩色的ANSI代码。
- default_timezone决定了在从数据库中读取日期和时间时,是使用Time.local(如果设置为:local)还是Time.utc(如果设置为:utc)。默认值为:local
- schema_format控制了从数据库中导出数据库模式到文件中所用的格式。选项:ruby(默认值)会使用一个数据库无关的migrations,选项:sql会使用(可能依赖于特定数据库的)SQL指令。
- timestamped_migrations控制了migrations的数字是使用连续的整数还是时间戳。默认值为true,代表使用时间戳,这在优多人共同开发同一个应用的时候是一个更好的选择。
- lock_optimistically控制了ActiveRecord是否使用乐观锁。默认该值为true
- ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans控制了ActiveRecord是否认为MySQL数据库中所有的tinyint(1)列为布尔值。默认该值为true
- ActiveRecord::SchemaDumper.ignore_table接受一个表名的数组,该数组中的表不应包含在任何生成的数据库模式文件中。该设置在ActiveRecord::Base.schema_format == :ruby时才会起作用。
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!,它会为你做所有需要的调整。
- 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。
- ActionController::Dispatcher.error_file_path给定了Rails用来寻找出错文件如404.html的路径。默认值为Rails.public_path。
- CGI::Session::ActiveRecordStore::Session.data_column_name用于设置用来存储session数据的列名。默认值为’data’。
3.3 配置Action View
Action View上只有不多的几个配置选项,从ActionView:Base的四个开始:
- debug_rjs决定RJS response是否会被包装在try/catch块中,并alert()被捕捉的异常(并重新将其抛出)(译者注:即是否对rjs使用debug模式,使得rjs的异常在开发工程中会被alert显示出来)。默认值为false。
- warn_cache_misses是否在一个action的结果遇到view路径中缓存未命中时Rails会显示一个警告。默认值为false。
-
field_error_proc提供了一个HTML生成器来显示来自于Active Record的错误。默认值为Proc.new { html_tag, instance “#{html_tag}”} - default_form_builder告诉Rails默认实用的表单构建器(form builder)。默认值为ActionView::Helpers::FormBuilder。
- ActionView::TemplateHandlers::ERB.erb_trim_mode提供了ERB使用的修剪模式(trim mode)。默认为’-’。查看ERB文档获得更多信息
3.4 配置Action Mailer
ActionMailer::Base上由一系列可用的配置:
- template_root提供了Action Mailer模版的根目录
- logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,用来记录来自Action Mailer的日志信息。设为nil则禁用日志记录功能。
- smtp_settings用来为smtp邮件发送方式提供详细的配置信息。它接受一个哈希组成的选项,包括如下任意的选项:
- :address允许你使用一个远端的邮件服务器。请将它从默认的”localhost”改为你所用的邮件服务器。
- :port如果你使用的邮件服务器不在25端口上运行,请修改这个配置。
- :domain如果你需要指定一个HELO域名,请在这里指定。
- :user_name如果你的邮件服务器需要认证,请在这里设置用户名
- :password如果你的邮件服务器需要认证,请在这里设置密码
- :authentication如果你的邮件服务器需要人证,你需要在此指定认证的类型。它应该是:plain,:login,和:cram_md3三个符号其中之一。
- sendmail_settings允许你对sendmail邮件发送方式进行详细的配置。它接受一个哈希组成的选项,包括如下任意的选项:
- :location — sendmail可执行文件的位置。默认为/usr/sbin/sendmail。
- :arguments — 命令行参数。默认值为-i -t
- raise_delivery_errors设置如果邮件发送没能完成是否需要抛出一个错误。默认值为true。
- delivery_method设置邮件发送方式。可以使用的值有:smtp(默认值),:sendmail以及:test
- perform_deliveries指定邮件是否要真得发送出去。默认值为:true,测试时可以方便地设为false。
- default_charset设定Action Mailer用于编码邮件主题和内容的字符集。默认为utf-8
- default_content_type设置消息的主体所使用的默认的content type。默认值为text/plain。
- default_mime_version设置消息实用的默认的MIME版本。默认值为1.0。
- default_implicit_parts_order — 当一个消息被隐式地构建(例如,邮件的多部分通过模版组装,而模版通过文件名设定了content type),这个变量控制多个部分的顺序。默认为[“text/html”, “text/enriched”, “text/plain”]
3.5 配置Active Resource
ActiveResource::Base中有一个配置可以设置:
logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,用来从Active Resource中记录日志信息。设为nil时禁用日志功能。
3.6 配置Active Support
Active Support中有一些配置选项:
- ActiveSupport::BufferedLogger.silencer设为false则禁用了对代码块的缄默日志(silence logging)功能(译者注:可以参看http://api.rubyonrails.com/classes/ActiveSupport/BufferedLogger.html#M001499,缄默日志使得silence方法可以对指定的代码块屏蔽日志功能或者改变日志的level)。默认值为true。
- ActiveSupport::Cache::Store.logger设定了缓存存储操作所使用的logger。
- ActiveSupport::Logger.silencer设为false则禁用了对代码块的缄默日志(silence logging)功能。默认值为true。
配置 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的版本。