`
xiaoheliushuiya
  • 浏览: 401781 次
文章分类
社区版块
存档分类
最新评论

配置 Rails 应用程序

 
阅读更多

这个指南涵盖了 Rails 应用程序的配置和初始化设置.通过浏览这个指南,你将能:

  • 调整 Rails 应用程序的运作
  • 附加程序启动时运行的代码

endprologue.

初始化代码的位置

Rails 提供四个标准的位置初始化代码

  • config/application.rb
  • 运行环境相关的配置文件
  • 各初始化程序
  • 后初始化程序(初始化完成后运行的程序)

先于Rails运行代码

有时候你需要在 Rails 加载自己之前运行代码, 将调用代码放在config/application.rb文件的require ‘rails/all’之上.

配置 Rails 组件

一般而言, 配置 Rails 的工作其实就是配置 Rails 的各个组件, 就像配置 Rails 本身一样. 配置文件+config/application.rb+ 和运行环境相关的配置文件(比如config/environments/production.br) 可以让你设定一些你想传递给所有组件的设置.

例如, 缺省的config/application.rb文件包括这个设置:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.filter_parameters += [:password]</p> </ruby>

这是给 Rails 本身的设置. 如果你想向单个 Rails 组件传递设置, 你同样可以在config/application.rb文件里通过同+config+对象做一样的操作.

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.active_record.observers = [:hotel_observer, :review_observer]</p> </ruby>

Rails 将会使用那些特定的设置来配置 Active Record.

一般的Rails配置

这些配置方法都是由Rails::Railtie对象调用的,比如Rails::Engine或者Rails::Application.

  • config.after_initialize会接受一个代码块,这个代码块将会在 Rails 初始化应用程序完毕_之后_再运行. 那包括框架自身, 引擎和在+config/initializers+里的所有应用程序初始化程序的初始化.请注意这个代码块_将会_为rake任务运行. 在给其它初始化程序进行配置时会很有用:
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.after_initialize do<br style=""> ActionView::Base.sanitized_allowed_tags.delete ‘div’<br style=""> end</p> </ruby>
  • config.allow_concurrency应该设置为 true 来处理同时运行(线程安全)的活动. False 为默认值. 你也许不会想要直接调用它, 那是因为要做一系列其它的调整来让线程安全模式良好的运行.也可以通过+threadsafe!+来激活.
  • config.asset_host用于设置资源主机. 当CDNs被使用于自己的资源主机,或者当你想用不同的域名别名来解决浏览器内建线程并发限制时会很有用.这是+config.action_controller.asset_host+ 的简短版本
  • config.asset_path让你布置资源的路径.可以是一个可调用的对象, 一个字符串,或者是默认值+nil+. 例如, 通常+blog.js+ 的路径会是/javascript/blog.js, 假设其绝对路径为path. 如果config.asset_path可调用, Rails 在生成资源路径的时候调用它,并向它投递+path+参数. 如果config.asset_path是个字符串, 它应该是个带有%ssprintf格式的字符串,path会插入到%s的位置. 在任何情况下, Rails 输出布置好的路径. 这是config.action_controller.asset_path简短版本.
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.asset_path = proc { |path| “/blog/public#{path}” }</p> </ruby>

NOTE. 如果开启了 asset pipeline,config.asset_path配置会被忽略. 默认是开启 asset pipeline.

  • config.autoload_once_paths接受一个路径数组, Rails将会自动加载这些路径中的常量,所以这些常量就不会在每次请求时都被清除. 如果+config.cache_classes+是 false , 这个配置将会无效, 这在开发环境下是默认的. 另外, 所有的自动加载都是发生一次. 数组里的所有元素必须同时在autoload_paths里。这默认是空数组.
  • config.autoload_paths接受一个路径数组, Rails将会自动加载这些路径着哦国内的常量. 默认是+app+目录下的所有目录.
  • config.action_view.cache_template_loading控制模板是否每个请求都要重新加载. 默认是config.cache_classes设置的任何值.
  • config.cache_store配置Rails缓存要使用什么缓存存储. 可选:memory_store,:file_store,:mem_cache_store其中一个, 有或者是实现了缓存API的一个对象.如果目录tmp/cache存在则默认是:file_store, 否则是:memory_store.
  • config.colorize_logging指定记录日志信息是否使用ANSI颜色码.默认是 true.
  • config.consider_all_requests_local是个标记. 如果为 true 则任何携带详细调试信息的错误信息都会被添加到 HTTP 回应(response) 里, 并且Rails::Info控制器会显示应用运行时上下文到/rails/info/properties. 在开发和测试模式默认是 true , 在生产模式是 false. 为了更细致的控制, 将其设置为 false 并在控制器里实现+local_request?+来指定哪些请求的错误信息需要提供调式信息.
  • config.dependency_loading是个标志. 将其设置为 false 可以使自动加载常量失效. 它只在config.cache_classes为 true 的时候才有效, 这在生产模式是默认的. 这个标志会被config.threadsafe!设置为 false.
  • config.eager_load_paths接受一个路径数组。 如果有开启类缓存,那么 Rails 会在启动时即时加载(eager load)这些路径里的内容. 默认是应用程序app目录下的所有目录.
  • config.encoding设置整个应用程序的编码. 默认是 UTF-8
  • config.exceptions_app设置异常处理应用程序. 这个应用程序在异常发生时会被ShowException中间件调用. 默认是ActionDispatch::PublicExceptions.new(Rails.pulic_path).
  • config.file_watcher被用于监测文件系统里文件更新的类. 在config.reload_classes_only_on_change为 true 的时候有效. 必须符合ActiveSupport::FileUpdateCheckerAPI.
  • config.file_parameters用于过滤掉不想被显示在日志里的参数, 比如密码和信用卡号码.
  • config.force_ssl强制所有的请求使用+ActionDispath::SSL+中间件走 HTTPS 协议.
  • config.log_level定义 Rails 日志的冗长程度. 这个选项默认为:debug并对所有模式有效,除了生产模式. 生产模式默认为+:info+
  • config.log_tags接受一组方法, 这些方法会被request对象使用. 这使标记调试信息日志行更容易, 像子域名和请求标识(id) — 在调试多用户应用程序产品时都很有用.
  • config.logger接受一个日志类, 这个类遵循Log4r或者 Ruby 默认的logger类的接口. 默认是ActiveSupport::BufferedLogger的对象, 在生产模式是关闭的.
  • config.middleware让你配置应用程序的中间件. 这在下面的Configuring Middleware章节有更深入的概述
  • config.preload_frameworks使应用程序在启动时是否预加载所有的框架. 通过config.threadsafe!开启. 默认是nil, 所以是关闭的.
  • config.preload_classes_only_on_change当被监测文件发生改变时,类是否能被重新加载.该值默认设置为 true, 所以会默认监测所有在自动加载路径里的内容. 如果config.cache_classes为 true, 这个选项会被忽略.
  • config.secret_token用于指定一个键, 这让应用程序会话对比已有的密钥来进行验证以防止干扰.应用程序会从config/initializers/secret_token.rb文件里获取被初始化为一个随机值的config.secret_token
  • config.serve_static_assets配置 Rails 自己处理静态资源. 默认为 true, 但在生产环境是被关闭的,因为有运行应用程序的服务器软件(e.g. Nginx 或 Apache)去处理静态资源. 将其设置为与默认值相反的 true, 则生产模式下会使用 WEBrick 运行(完全不建议!)或者测试你的应用. 不然你将不能使用页面缓存,而且对位于公共目录下文件的请求都会被转给 Rails 应用.
  • config.session_store通常在config/initializers/session_store.rb里设置并指定使用什么类去存储会话. 可能的值会是默认的+:cookie_store+,:mem_cache_store, 或:disabled. 最后一个告诉 Rails 不处理会话. 也可以指定自定义会话存储:
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.session_store :my_custom_store</p> </ruby>

这个自定义存储必须被定义为ActionDispatch::Session::MyCustomStore. 根据这些 symbols, 它们也可以是实现了一些 API 的对象, 如ActiveRecord::SessionStore, 这种情况就可以不指定命名域.

  • config.threadsafe!激活allow_concurrency,cache_classes,dependency_loadingpreload_frameworks来让应用程序实现线程安全。

WARNING: 线程安全操作与一般开发模式下的 Rails 不兼容的。特别要注意的是当你调用config.threadsafe的时候,自动依赖加载和类重新加载都会被自动取消。

  • config.time_zone设置应用程序 Active Record 可用的默认时区。
  • config.whiny_nil开启或取消当一些方法被nil调用且nil没有这些方法的时候抛出警告。在开发和测试环境都默认为 true.
  • config.console让你设置当你运行rails console的时候用作控制台的类。
    它最好在console代码块下运行:
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">console do</p> <ol style="padding:0px 0px 0px 30px; margin:15px 0px"> <li style="">this block is called only when running console,</li> <li style="">so we can safely require pry here<br style=""> require “pry”<br style=""> config.console = Pry<br style=""> end<br style=""> </li> </ol></ruby>

配置资源

Rails 3.1, 默认使用sprocketsgem 来管理资源。这个 gem 可以合并并压缩资源以降低服务器负载。

  • config.assets.enabled是一个标记,这个标记控制是否使用 asset pipeline。 这在config/application.rb里被明确的初始化了.
  • config.assets.compress标记是否压缩已经编译好的资源。这在+config/production.rb+里明确的设置为 true.
  • config.assets.css_compressor定义要使用的 CSS 压缩器。默认被设置为sass-rails。目前唯一可选的值是:yui, 这会使用yui-compressorgem.
  • config.assets.js_compressor定义要使用的 JavaScript 压缩器。很可能是:closure,:uglifier:yui,分别需要使用到closure-compiler,uglifier或者yui-compressorgem.
  • config.assets.paths包含了所有用来搜寻资源的路径。 添加到这个配置选项里的路径都会被用于搜索资源.
  • config.assets.precompile让你指定其它(+application.css+ 和application.js以外的)资源,这些资源会在rake assets:precompile执行时被预编译.
  • config.assets.prefix指定资源目录的前缀,默认是+/assets+.
  • config.assets.digest使资源的名字使用 MD5 指纹。在+production.rb+默认设置为true.
  • config.assets.debug不合并压缩资源。在development.rb里默认不设置为false.
  • config.assets.manifest指定资源预编译器的待编译列表文件所在目录完整的路径。默认使用config.assets.prefix(译者注: 也就是开头有一列诸如//=require jquery的文件所在路径)
  • config.assets.cache_store指定 Sprockets 使用的缓存存储. 默认是 Rails 的文件存储。
  • config.assets.version是一个字符串选项,用于生成 MD5 哈希值。可以被更改从而强制对所有文件进行预编译.
  • config.assets.compile是一个布尔值,可以用于让Sprockets 在生产环境即时执行编译。
  • config.assets.logger接受一个遵循 Log4r 或者 Ruby 默认Logger类接口的日志类.默认和config.logger指定的一样。设置config.assets.logger为 false, 就可以关闭记录资源处理的日志。

配置生成器

Rails 3 允许你使用config.generators方法修改生成器.这个方法接受一个代码块:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.generators do |g|<br style=""> g.orm :active_record<br style=""> g.test_framework :test_unit<br style=""> end</p> </ruby>

可以在这个代码块里使用的所有方法列表如下:

  • assets允许在创建一个 scaffold 时候创建资源文件。默认是true
  • force_plural运行将数据模型(model)的名字都变成复数。默认是false
  • helper指定是否要创建 helpers. 默认是true
  • integration_tool指定使用哪个集成工具。默认是nil
  • javascripts开启生成器中 javascripts 的 hook. 被使用于 Rails 运行scaffold生成器的时候。默认是 +true+。
  • javascript_engine配置用于生成资源的引擎(例如, coffee).默认为nil.
  • orm指定使用哪个orm. 默认是false并且默认使用 Active Record.
  • performance_tool指定使用哪个性能工具.默认为+nil+
  • resource_controller指定当使用rails generate resource时,生成控制器的生成器.默认是:controller
  • scaffold_controller和 +resource_controller+不同,当使用rails generate scaffold时,指定生成器生成scaffolded控制器。
  • stylesheets开启生成器中的式样的 hook 。在Rails中被用于scaffold生成器运行的时候, 但这个 hook 也可以用在其它生成器。默认为true
  • stylesheets_engine配置生成资源的式样引擎(例如, sass)。默认是css
  • test_framework指定使用哪个测试框架。默认为false, 并且默认使用 Test::Unit.
  • template_engine指定使用哪个模板引擎,比如 ERB 或 Haml.默认为:erb.

配置中间件

所有的 Rails 应用程序都来自于一系列标准的中间件,这些中间件以下列顺序被使用于开发环境:

  • ActionDispatch::SSL强制所有请求走HTTPS协议。在config.force_ssl被设置为true的时候有效。传递给它的选项可以在config.ssl_options编辑.
  • ActionDispatch::Static用于处理静态资源。在config.serve_static_assets设置为true的时候无效。
  • Rack::Lock将应用封装成互斥体,所以应用程序一次只能被单个线程调用。只在config.action_controller_concurrency设置为 +false+的时候才有效, 这是默认的.
  • ActiveSupport::Cache::Strategy::LocalCache作为基础的内存支持缓存器(memory backed cache). 这个缓存器不是线程安全的,并且只是作为单个线程的临时内存缓存器。
  • Rack::Runtime设置一个X-Runtime头部,包括执行请求所用的时间(精确到秒)。
  • Rails::Rack::Logger通知日志请求已经开始。请求完成后,清除所有的日志。
  • ActionDispatch::ShowExceptions救回(回收)应用程序返回的异常,如果是本地请求或者config.consider_all_requests_local设置为true的话,还会渲染出漂亮的异常信息页。如果config.action_dispatch.show_exceptions设置为 +false+, 抛出的异常会被忽略。
  • ActionDispatch::RequestId产生一个唯一的 X-Request-Id 头部给 response,并启用ActionDispatch::Request#uuid方法.
  • ActionDispatch::RemoteIp用于防止IP欺骗攻击。可在config.action_dispatch.id_spoofing_checkconfig.action_dispatch.trusted_proxies进行设置.
  • Rack::Sendfile拦截所有正文(HTTP 正文)用于处理文件的响应(responses),并将其替换成一个服务器指定的 X-Sendfile 头部(HTTP 头部). 可以在config.action_dispatch.x_sendfile_header配置.
  • ActionDispatch::Callbacks在处理请求之前运行预先准备的回调。
  • ActiveRecord::ConnectionAdapters::ConnectionManagement在每次请求完成后清除连接,除非rack.test键在请求的环境设置中设置为true
  • ActiveRecord::QueryCache缓存请求中产生的 SELECT 查询。如果换成任何 INSERT 或者 UPDATE 则缓存会被清除.
  • ActionDispatch::Cookies为请求设置 cookies.
  • ActionDispatch::Session::CookieStore负责存储cookies中的会话。修改config.action_controller.session_store为那些可选值,可以使用其它可选的中间件. 另外,传递给这个中间件的参数可以在config.action_controller.session_options配置.
  • ActionDispatch::Flash设置flash的键值。只有在config.action_controller.session_store设置为某个值才会起作用
  • ActionDispatch::ParamsParser将请求中的参数解析到params里.
  • Rack::MethodOverride如果params[:_method]有设置值,那么允许方法被重写。这个中间件支持 PATCH, PUT 和 DELETE 的 HTTP方法类型.
  • ActionDispatch::Head将所有 HEAD 请求转换成 GET 请求,然后再处理。
  • ActionDispatch::BestStandardsSupport启用 “最好的标准支持” 所以IE8能正确的渲染元素.

除了这些常用的中间件,你可以通过config.middleware.use方法添加自己的:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.middleware.use Magical::Unicorns</p> </ruby>

这会将Magical::Unicorns中间件放置到堆栈的尾部。如果你想添加一个中间件到另一个的前面,可以使用insert_before

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.middleware.insert_before ActionDispatch::Head, Magical::Unicorns</p> </ruby>

当然也有 +insert_after+,它将把某个中间件插入到另一个的后面:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.middleware.insert_after ActionDispatch::Head, Magical::Unicorns</p> </ruby>

所有的中间件也可以被完全移除并替换成其它的:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.middleware.swap ActionDispatch::BestStandardsSupport, Magical::Unicorns</p> </ruby>

它们也能完全从堆栈中被移除.

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.middleware.delete ActionDispatch::BestStandardsSupport</p> </ruby>

除了这些操作堆栈的方法,如果你的应用程序只作为一个 API 端的话,中间件堆栈可以像这样设置:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.middleware.http_only!</p> </ruby>

通过这样做,Rails将会创建一个更小的中间件堆栈,这个堆栈中不会添加一些通常对浏览器访问有用的中间件, 比如 Cookies, 会话,闪存(Flash), BestStandardsSupport 和 MethodOverride. 你可以手动添加它们。查阅API App docs可以获得更多关于如何设置你API应用程序的信息。

配置 i18n

  • config.i18n.default_locale设置某个使用 i18n 应用程序的默认本地语言环境。默认为:en
  • config.i18n.load_path设置 Rails 用来搜索本地化文件的路径。默认为config/locales/*.{yml,rb}

配置 Active Record

config.active_record包括了下列配置选项:

  • config.active_record.logger接受一个符合 Log4r 或者 Ruby 默认日志类 接口的日志类, 并会被传递给任何新建立的数据库连接. 你可以通过调用 Active Record 模型类或者示例的logger来取得这个日志类. 默认设置为nil以取消日志记录.
  • config.active_record.primary_key_prefix_type让你调整主键栏的名字。默认情况下, Rails 假设主键栏被命名为+id+(这个配置选项不需要设置。) 。还有两个其它选择:
    • :table_name将 Customer 类的主键栏命名为 +customerid+。
    • :table_name_with_underscore将 Customer 类的主键栏命名为 +customer_id+。
  • config.active_record.table_name_prefix让你设置一个全局字符串附加到表名前面. 如果你这个字符串设置为northwest_, 那么 Customer 类将寻找northwest_customers表作为它的表. 默认是一个空字符串.
  • config.active_record.table_name_suffix让你设置一个全局字符串附加到表名后面. 如果你将它设置为_northwest, 那么 Customer 类将会找到customers_northwest作为它的表. 默认是一个空字符串.
  • config.active_record.pluralize_table_names指定 Rails 是否以使用单复数的表名. 如果设置为 true (默认值), 那么 Customer 类将会使用customers表. 如果设置为 false, 那么 Customer 类将会使用customer表.
  • config.active_record.default_timezone当从数据库获取日期和时间时,决定是否使用Time.local(如果设置为:local) 还是Time.utc(如果设置为:utc). 虽然 Active Record 在 Rails 以外使用时默认为:local, 但在 Rails 中默认为:utc.
  • config.active_record.schema_format控制将数据库结构导出到文件的格式。选项分别是:ruby(默认),与数据库无关的选项但与 migrations 相关. 或者是:sql, 一连串 (大部分情况是与数据库相关的) SQL 语句.
  • config.active_record.timestamped_migrations控制所有迁移脚本 (migrations) 的命名中是否带有序列或者时间戳. 如果有多个开发者开发同一个应用程序,建议使用默认的时间戳.
  • config.active_record.lock_optimistically控制 Active Record 是否使用乐观锁, 默认是使用的。
  • config.active_record.whitelist_attributes将会创建一个空白的白名单,这个名单包含了在批量赋值 (mass assignment) 防护下可进行批量赋值的模型属性,并对应用程序里所有模型有效。
  • config.active_record.auto_explain_threshold_in_seconds配置自动执行(sql指令)+EXPLAIN+的临界值。所有逼近临界值的查询会把它们的查询计划进行日志记录。在开发模式下默认是 0.5。
  • config.active_record.dependent_restrict_raises当某个具有:dependent => :restrict关联关系的对象被删除时,控制该行为。设置为false将会阻止抛出+DeleteRestrictionError+异常,并且会将错误信息添加入到模型对象里。在开发模式下默认为flase.
  • config.active_record.mass_assignment_sanitizer将会判断 Rails 中对批量赋值(mass assignment)清理的严格程度。默认为:strict. 在这个模式下,调用create或者update_attributes并对任何不是+attr_accessible+的属性进行批量赋值的话,将会抛出一个异常。如果设置这个选项为:logger的话,只会将某个属性被赋值时的异常信息打印到日志文件,并不抛出异常。

MySQL 适配器的一个附加配置选项:

  • ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans控制活动日志(Active Record)是否会将MySQL数据库中tinyint(1)栏当作布尔值,默认是true.

结构导出器(Schema Dumper)的一个附加配置选项:

  • ActiveRecord::SchemaDumper.ignore_tables接受一组表,任何产生的(数据库)结构(schema)文件都_不_会包含这些表。如果config.active_record.schema_format == :ruby, 那么这个设置会被忽略.

配置 Action Controller

config.action_controller包括了这些配置设置:

  • config.action_controller.asset_host设置资源主机。当CDNs被用于资源主机而不是应用程序自己处理资源时很有用.
  • config.action_controller.asset_path接受一个代码块,这个代码块配置在哪里可以找到资源文件。更简短的版本是config.asset_path.
  • config.action_controller.page_cache_directory是 web 服务器的文档的根目录,使用Base.page_cache_directory = “/document/root”的值.在 Rails 中,这个目录已经被设置为Rails.public_path(它的值通常设置为Rails.root + “/public”)。改变这个值对防止public里的文件名冲突很有用,但这么做需要配置你的 web 服务器从新的地方寻找缓存文件。
  • config.action_controller.page_cache_extension配置保存在page_cache_directory的缓存页面使用的扩展名。默认为.html
  • config.action_controller.perform_caching配置应用程序是否进行缓存。开发模式默认关闭,在生产模式默认开启.
  • config.action_controller.default_charset规定所有渲染器的字符编码。默认是 “utf-8”。
  • config.action_controller.logger接受一个符合 Log4r 或者 Ruby 默认日志类的接口的日志类,这个日志类用于记录来自 Action Controller 的信息。设置为nil则不进行记录。
  • config.action_controller.request_forgery_protection_token为 RequestForgery 设置令牌的参数名。调用protect_from_forgery默认将其设置为+authenticity_token+。
  • config.action_controller.allow_forgery_protection_token是否使用 CSRF 保护。默认在测试模式下使用,其它模式不使用。
  • config.action_controller.relative_url_root用于告诉 Rails 你要部署到某个子目录。默认为ENV[‘RAILS_RELATIVE_URL_ROOT’]

缓存代码的两个附加设置:

  • ActionController::Base.page_cache_directory设置缓存页面的存放目录,这些页面是 Rails 为你的web服务器创建的。默认为Rails.public_path(通常设置为Rails.root + “/public”).
  • ActionController::Base.page_cache_extensions设置缓存页(文件)的扩展名(如果请求已经有扩展名,那将忽略这个设置)。默认为.html

Active Record 会话存储也可以这样配置:

  • ActiveRecord::SessionStore::Session.table_name设置会话存储使用的表名。默认为 +session+。
  • ActiveRecord::SessionStore::Session.primary_key设置会话存储表 ID 栏的名字。默认为 +session_id+。
  • ActiveRecord::SessionStore::Session.data_column_name设置存放汇集了会话数据那栏的名字。默认为 +data+。

配置 Action Dispatch

  • config.action_dispatch.session_store设置会话数据存储的名字。默认是:cookie_store;其它可选的包括:active_record_store,:men_cache_store或者你自己定义的类名。
  • config.action_dispatch.tld_length设置应用程序 TLD (顶级域)的长度.默认为1.
  • ActionDispatch::Callbacks.before接受一个代码块,在请求之前运行。
  • ActionDispatch::Callbacks.to_prepare接受一个代码块,在Action::Dispatch::Callbacks.before之后运行,但在请求之前。+development+模式中每个请求都会运行这个代码块,但在production模式下或者设置cache_classes为 true 的环境只运行一次.
  • ActionDispatch::Callbacks.after接受一个代码块,在请求之后运行。

配置 Action View

config.action_view包括了这些配置设置:

  • config.action_view.field_error_proc提供一个 HTML 生成器,用于显示 Active Record 的错误信息。默认为
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">Proc.new { |html_tag, instance| %Q(</p> <div style="">#{html_tag}</div> ).html_safe }</ruby>
  • config.action_view.default_form_builder告诉Rails默认使用哪个表格创建器。默认为ActionView::Helpers::FormBuilder.
  • config.action_view.logger接受一个日志类,这个类要遵循 Log4r 或者 Ruby 默认日志类的接口。该类会被用于记录来自 Action View 的信息。设置为nil来关闭日志。
  • config.action_view.erb_trim_mode给出被ERB使用的修剪模式。默认为‘-’。更多信息查阅ERB documentation
    (译者注:<%= content -%>将清除 content 首尾的空白)
  • config.action_view.javascript_expansions是一个包含了扩展的哈希数组。这些扩展可以通过 JavaScript 导入标签被导入使用。默认情况下是这么定义的:
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.action_view.javascript_expansions = { :defaults =&gt; %w(jquery jquery_ujs) }</p> </ruby>

然而,你也许像这样定义其它的扩展:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">config.action_view.javascript_expansions[:prototype] = [‘prototype’, ‘effects’, ‘dragdrop’, ‘controls’]</p> </ruby>

并且可以在视图里像这样进行引用:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">&lt;%= javascript_include_tag :prototype %&gt;</p> </ruby>
  • config.action_view.stylesheet_expansionsjavascript_expansions的工作方式差不多,但没有默认的项。在这个哈希数组定义的所有键都可以在视图里像这样引用:
<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">&lt;%= stylesheet_link_tag :special %&gt;</p> </ruby>
  • config.action_view.cache_asset_ids当启用缓存时,资源标签助手(helper)会进行几个高耗的文件系统调用(默认进行文件系统时间戳检查)。然而这样可以防止当服务器运行时修改任何资源文件。
  • cofnig.action_view.embed_authenticity_token_in_remote_forms让你设置具有:remote => true属性的表单中是否默认带有 +authenticity_token+。默认情况下这个值设置为 false , 这意味着远程表单里将不包含 +authenticity_token+,这对你局部缓存表单会很有用。运程表单将通过meta标签获得真实性(认证), 所以嵌入是必要的,除非你支持没有 Javascript 的浏览器。在这种情况下,你可以投递:authenticity_token => true作为表单参数或者将这个配置设置为true
  • config.action_view.prefix_partial_path_with_controller_namespace用来指定控制器是否从模板的子目录中根据控制器的命名空间搜索 partial 模板。例如,考虑某个命名为Admin::PostsController的控制器,它渲染这个模板:

<%= render @post %>

默认设置为true, 这样就会使用位于/admin/posts/_post.erb的局部视图。将其值设置为false则会渲染/posts/_post.erb,这和没有命名域的控制器的渲染动作是一样的。

配置 Action Mailer

config.action_mailer有这么些可用的设置:

  • config.action_mailer.logger接受一个日志类,这个类要遵循 Log4r 或者 Ruby 默认日志类的接口。这个类会被用于记录来自 Action Mailer 的信息。设置为nil关闭日志。
  • config.action_mailer.smtp_settings允许详细配置:smtp传送方法。它接受一个选项哈希数组,可以包括一下任何选项:
    • :address– 允许你使用远程的邮件服务器。只要改变默认设置的 “localhost” 值就可以了。
    • :port– 万一你的邮件服务器不是运行在 25 端口的话,在这进行修改。
    • :domain– 如果你需要指定一个 HELO 域名,在这里设置。
    • :user_name– 如果你的邮件服务器需要认证,在这个设置里填入用户名。
    • :password– 如果你的邮件服务器需要认证,在这里设置密码。
    • :authentication如果你的邮件服务器需要认证,你需要在这指定认证的类型。这是一个 symbol 值,可填入:plain,:login,:cram_md5其中一个。
  • config.action_mailer.sendmail_settings允许详细配置sendmail发送方法。它接受一个包含选项的哈希数组,包括以下任何选项:
    • :location– sendmail 执行文件的位置. 默认为/usr/sbin/sendmail
    • :arguments– 命令行参数。默认为-i -t
  • config.action_mailer.raise_delivery_errors设定当邮件发送失败时是否抛出异常。默认为 true.
  • config.action_mailer.delivery_method指定发送方法。可用的值为:smtp(默认),:sendmail, 和:test
  • config.action_mailer.perform_deliveries设定邮件是否会被发送,默认为 true. 可以将其设置为 false 以方便测试。
  • config.action_mailer.default配置 Action Mailer 的默认值。这些默认值为:
    <ruby style=""><br style=""> :mime_version =&gt; “1.0”,<br style=""> :charset =&gt; “UTF-8”,<br style=""> :content_type =&gt; “text/plain”,<br style=""> :parts_order =&gt; [ “text/plain”, “text/enriched”, “text/html” ]<br style=""></ruby>
  • config.action_mailer.observers登记观察者,在邮件被发送时会作出提醒。
    <ruby style=""><br style=""> config.action_mailer.observers = [“MailObserver”]<br style=""></ruby>
  • config.action_mailer.interceptors登记拦截器,它会在邮件发送前被调用。
    <ruby style=""><br style=""> config.action_mailer.interceptors = [“MailInterceptor”]<br style=""></ruby>

配置 Active Support

Active Support 有如下一些可用配置选项:

  • config.active_support.bare是否让active_support/all在 Rails 启动时的加载。默认为nil, 意思是active_support/all已经加载了(所以Rails不会再加载)。
  • config.active_support.escape_html_entities_in_json设置在 JSON 序列化中是否剔除 HTML 实体。默认为true.
  • config.active_support.use_standard_json_time_format是否使日期序列化成 ISO 8601 格式。默认为false.
  • ActiveSupport::BufferedLogger.silencer设为false则禁止取消代码块里的日志记录。默认为 +true+。
  • ActiveSupport::Cache::Store.logger设定在缓存存储操作中的日志类。
  • ActiveSupport::Deprecation.behaviorconfig.active_support.deprecation可选的设置器,它能配置 Rails 废弃警告的动作。
  • ActiveSupport::Deprecation.silence接受一个代码块,这个代码块里的所有废弃警告都会被忽略。
  • ActiveSupport::Deprecation.slienced设置是否打印出废弃警告。
  • ActiveSupport::Logger.silencer设为false则禁止取消代码块里的日志记录。默认为 +true+。

配置数据库

几乎所有 Rails 应用程序都会和数据库交互。 数据库在一个叫做config/database.yml的文件里被指定的。 如果你在一个新的 Rails 应用里打开这个文件,你会看到一个默认数据库配置为 SQLite3。 该文件包含三个部分,分别是不同的 Rails 运行环境:

  • development环境用于你的开发或本地电脑,所以你可以手动控制应用程序。
  • test环境用于运行自动测试的时候。
  • production环境用于部署应用程序给全世界用的时候。

TIP: 你不必手动更新数据库配置文件。如果你查看应用程序生成器的选项, 你会发现其中一个选项为—database. 这个选项允许你选择一个适配器,这个适配器可以是最常用的关系型数据库。你甚至可以重复运行生成器:cd .. && rails new blog —database=mysql. 如果你确认重写config/database.yml文件, 你的应用程序将被配置使用 MySQL 而不是 SQLite. 常用数据库连接的详细例子会在下面说到。

配置 SQLite3 数据库

Rails 内建支持SQLite3, SQLite3 是一个轻量型,不需要服务器的数据库应用程序。在一个繁忙的生产环境中应该会使其过载,但在开发和测试环境会运作的很好。创建一个新项目的时候,Rails 会默认使用 SQLite 数据库,但你可以随后自行修改.

下面这部分是默认配置文件中开发环境的连接信息:

development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000

NOTE: Rails 默认使用 SQLite3 数据库存储数据是因为它是一个不需要配置就能工作的数据库。Rails 也支持 MySQL 和 PostgreSQL, 并且有许多其它数据库的插件。如果你在生产环境中使用数据库,Rails 通常都能为其提供一个适配器.

配置 MySQL 数据库

如果你选择 MySQL 而不是已有的 SQLite3 数据库,+config/database.yml+ 将会有些不同。下面是开发环境部分:

development:
adapter: mysql2
encoding: utf8
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock

如果你的开发电脑安装的 MySQL 有一个没有密码的 root 用户,你可以使用这个配置。不然,在开发环境部分的更改相应的 username 和 password。

配置 PostgreSQL 数据库

如果你选择 PostgreSQL,+config/database.yml+ 要被自定义使用 PostgreSQL 数据库:

development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
username: blog
password:

如果你使用外部的连接池管理的话,你可以取消 Rails 的 prepared statements:

production:
adapter: postgresql
prepared_statements: false

为 JRuby 平台配置 SQLite3

如果你选择使用 SQLite3 并且使用的是JRuby,config/database.yml将会有一点不同。这是开发环境部分:

development:
adapter: jdbcsqlite3
database: db/development.sqlite3

为 JRuby 平台配置 MySQL

如果你选择使用 MySQL 并且使用的是JRuby,config/database.yml将会有一点不同。这是开发环境部分:

development:
adapter: jdbcmysql
database: blog_development
username: root
password:

为 JRuby 平台配置 PostgreSQL

如果你选择使用 PostgreSQL 并且使用的是JRuby,config/database.yml将会有一点不同。这是开发环境部分:

development:
adapter: jdbcpostgresql
encoding: unicode
database: blog_development
username: blog
password:

修改development部分相应的用户名和密码。

Rails 环境设置

Rails 的某些部分也可以通过设置环境变量,进行外部赋值来配置。以下环境变量会被 Rails 的各部分识别:

  • +ENV[“RAILS_ENV”] 定义了 Rails 的运行环境 (生产,开发,测试等等)。
  • +ENV[“RAILS_RELATIVE_URL_ROOT”] 当你的应用程序部署到某个子目录下时,用它帮助路由(routing)代码识别 URLs。
  • +ENV[“RAILS_ASSET_ID”] 将重写默认的 cache-busting 时间戳章,这个时间戳章是 Rails 为可下载资源生成的.
  • ENV[“RAILS_CACHE_ID”]ENV[“RAILS_APP_VERSION”]用于生成 Rails 缓存代码的扩展缓存键。这可以让同一个应用程序有多个独立分开的缓存。

使用 Initializer 文件

加载完框架和应用程序的所有 gems 之后,Rails 会接着去加载所有的初始化程序. 初始化程序是存放在config/initializers里任何的一个 Ruby 文件。你可以使用 initializers 容纳所有待配置选项和设置,它们会在所有框架和 gems 加载完之后进行配置和设置,例如为这些部分配置设置的选项。

NOTE: 你可以使用子文件夹来组织你的初始化程序, 因为 Rails 会纵向搜索整个 initializers 文件夹。

TIP: 如果你的 initialziers 里有一组依赖,你可以根据名字控制加载循序。例如,01_critical.rb将比01_normal.rb先被加载。

初始化事件

Rails 有 5 种初始化事件, 这些事件可以被挂上 hook (以下列出了它们的运行顺序)

  • before_configuration: 这个和继承了Rails::Application的应用程序常量同时运行。+config+ 回调会在这发生之前生成。
  • before_initialize: 这个在应用程序的初始化过程之前立即运行。应用程序的初始化过程出现于接近 Rails 整个初始化过程的最开始,并带有:bootstrap_hook初始化程序。
  • to_prepare: 在所有为 Railties 运行(包括应用程序自身)的初始化程序之后运行,但在即时加载(eager loading)和中间件堆创建之前运行。最重要的是,在+development+环境中,会在所有的请求上运行。而在productiontest环境只会运行一次(启动的期间)。
  • before_eager_load: 在即时加载(eager loading)发生之前立即运行. 这是_生产_ 环境的默认行为,但在_开发_环境则不是。
  • after_initialize: 应用程序加载后立即运行,但在应用程序的初始化程序之前运行。

Rails::Application,Rails::Railtie或者Rails::Engine的子类里使用代码块语法, 可以为这些事件定义 hook :

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">module YourApp<br style=""> class Application &lt; Rails::Application<br style=""> config.before_initialize do</p> <ol style="padding:0px 0px 0px 30px; margin:15px 0px"><li style="">initialization code goes here<br style=""> end<br style=""> end<br style=""> end<br style=""> </li></ol></ruby>

可选的,你也可以通过Rails.application对象的config方法这么做。

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">Rails.application.config.before_initialize do</p> <ol style="padding:0px 0px 0px 30px; margin:15px 0px"><li style="">initialization code goes here<br style=""> end<br style=""> </li></ol></ruby>

WARNING: 应用程序的一些部分,特别是 观察者(observers) 和 路由(routing) 在after_initialize代码块被调用之时都还没有启动。

Rails::Railtie#initializer

Rails 有数个初始化程序在(应用程序)启动的时候运行,它们都使用Rails::Railtieinitializer方法定义。下面是 Active Suppport 的initialize_whiny_nils初始化程序的例子:

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">initializer “active_support.initialize_whiny_nils” do |app|<br style=""> require ‘active_support/whiny_nil’ if app.config.whiny_nils<br style=""> end</p> </ruby>

initializer方法接受三个参数,第一个初始化程序的名字,第二个是可选项的哈希数组(这里没有显示)和第三个是一个代码块。 选项哈希数组里的before键可以指定为指定哪个初始化程序必须在这个初始化程序之前运行,而after键则指定哪个初始化程序在这个初始化程序_之后_运行。

通过initializer方法定义的初始化程序会按照它们被定义的顺序运行,除了那个使用:before或者:after方法的。

WARNING: 如果初始化程序运行有逻辑关系,你应该将一个初始化程序放在另一个之前或者之后。比如说有 4 个初始化程序, “one” 到 “four”(按照这个顺序定义),并且你定义"four"在"four"_之前_ 但在"three"_之后_运行。像这种无逻辑的定义Rails将不能确定它们的顺序。

initializer方法的代码块参数是应用程序自身的对象,所以我们能通过它使用config方法访问配置,就像在例子里做的那样。

因为Rails::Application继承了Rails::Railtie(非直接),你可以使用config/application.rb里的initializer方法去为应用程序定义初始化程序.

Initializers

下面是一列所有能在 Rails 中找到的初始化程序,并按它们被定义的顺序排列 (也是它们运行的顺序,除非有其它设定)

load_environment_hook
作为一个占位器,所以让:load_environment_config可以被定义在这之前运行。

load_active_support导入active_support/dependencies为 Active Support 建立基础。如果config.active_support.bare不可确定, 也可以导入active_support/all,这是默认的。

preload_frameworks如果config.preload_frameworkstrue或者 "可确定性的",那么将自动地加载所有 Rails 会自动加载的依赖。一般这个配置选项是关闭的。在 Rails 里,内部的类第一次被引用的时候才会自动加载。+:preload_frameworks+ 在初始化的时候就会一次过加载完它们。

initialize_logger初始化应用程序的日志类(一个ActiveSupport::BufferedLogger对象) 并且让它可以通过Rails.logger访问. 当在这个点之前插入的初始化程序还没有定义Rails.logger的时候运行。

initialize_cache如果Rails.cache还没有设置,则通过引用config.cache_store的值并将其赋予Rails.cache来初始化。如果该对象有middleware方法,它的中间件将被插入到Rack::Runtime之前.

set_clear_dependencies_hook提供一个给active_record.set_dispatch_hooks使用的 hook, 它会在这个初始化程序之前运行. 这个初始化程序 — 只有在cache_classes设置为false的时候运行 — 使用ActionDispatch::Callbacks.after去除在请求中就已经被引用并来自对象层面的常量(依赖),所以它们会在后续的请求中被重新加载。

initialize_dependency_mechanism如果config.cache_classes为 true, 配置ActiveSupport::Dependencies.mechanismrequire依赖而不是load它们。

bootstrap_hook运行所有配置了before_initialize的代码块。

i18n.callbacks在开发环境中,建立一个to_prepare回调, 如果任何一个本地化文件从最后一次请求之后有更改, 这个回调将会调用I18n.reload!

active_support.initialize_whiny_nilsconfig.whiny_nils为 true 的情况下引入active_support/whiny_nil这个文件会输出如下错误:

Called id for nil, which would mistakenly be 4 — if you really wanted the id of nil, use object_id

和:

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

active_support.deprecation_behaivor为(运行)环境建立废弃报告,默认开发环境为:log, 生产环境为:notify和 测试环境的:stderr。 如果config.active_support.deprecation没有设置值,那么这个初始化程序就会提示用户去config/environments里与当前环境对应的文件修改该行(config.active_support.deprecation)。那个值可以是一个数组。

active_support.initialize_time_zone根据config.tiem_zone设置为应用程序设置默认的时区,默认为 “UTC”.

action_dispatch.configure配置ActionDispatch::Http::URL.tld_length的值为config.action_dispatch.tpl_length的值。

action_view.cache_asset_ids当 Active Support 加载时,设置ActionView::Helpers::AssetTagHelper::AssetPatchs.cache_asset_idsfalse, 但前提是config.cache_classes也有加载。

active_view.javascript_expansions登记由config.active_view.javascript_expansionsconfig.action_view.stylesheet_expansions建立起来的扩展名,这个扩展名可以被 Action View 识别并且在视图中使用.

action_controller.logger设置ActionController::Base.logger— 如果这个还没有设置 — 为Rails.logger

action_controller.initialize_framework_caches设置ActionController::Base.cache_store— 如果它还没有被设置 — 为Rails.cache.

action_controller.set_configs通过使用config.action_controller里的设置来建立 Action Controller. 而这个初始化程序是将方法名作为 setterssendActionController::Base并通过它传值来使用config.action_controller的设置的。

action_controller.compile_config_methods为指定的配置设置方法初始化,所以它们能被更快的访问。

active_record.initialize_timezone设置ActiveRecord::Base.time_zone.aware_attributes为 true, 就好像设置ActiveRecord::Base.default_timezone为 UTC. 当属性从数据库被读取的时候,它们会被转换成由Time.zone指定的时区.

active_record.logger设置ActiveRecord::Base.logger— 如果它还没有设置 — 为Rails.logger

active_record.set_configs通过使用config.active_record里的设置来建立 Action Record. 而这个初始化程序是将方法名作为 setterssendActionRecord::Base并通过它传值来使用config.active_record的设置的。

active_record.initialize_databaseconfig/database.yml加载数据库配置(默认)并为当前环境建立连接。

active_record.log_runtime引入ActiveRecord::Railties::ControllerRuntime,它会负责为请求代码块向日志器报告 Active Record 调用所使用的时间.(译者注: 就是说ActiveRecord::Railties::ControllerRuntime会记录一个请求发生时调用 Active Record 所占用的时间到日志里)

active_record.set_dispatch_hooks如果config.cache_classes设置为false的话,重置所有可重载的数据库连接。

action_mailer.logger设置ActionMailer::Base.logger— 如果它还没又被设置 — 为Rails.logger.

action_mail.set_configs通过使用config.action_mailer里的设置来建立 Action Mailer. 而这个初始化程序是将方法名作为 setterssendActionMailer::Base并通过它传值来使用config.action_mailer的设置的。

action_mail.compile_config_methods为指定的配置设置方法初始化,所以它们能被更快的访问。

set_load_path这个初始化程序在bootstrap_hook之前运行。它将vendor, +lib+,所有在app路径下的目录和任何在config.load_paths里指定的路径添加到$LOAD_PATH

set_autoload_paths这个初始化程序在bootstrap_hook之前运行。 将app下所有的目录和任何在config.autoload_paths指定的目录添加到ActiveSupport::Denpendencies.autoload_paths里。

add_routing_paths加载 (默认) 所有config/routes.rb(在应用程序和 railties, 包括 engines 里的) 并为应用程序建立路由。

add_locales添加config/locales里的所有文件(来自应用程序,railties 和 engines) 到I18n.load_path里,准备好这些文件中的翻译。

add_view_paths添加应用程序,railties 和 engines 里的app/views, 所以应用程序可以在这些路径里寻找视图文件。

load_environment_config为当前环境加载加载config/environments文件。

append_asset_paths寻找应用程序和所有附加的 railties 的资源路径,还有保存config.static_asset_paths中可用的目录列表。

prepend_helpers_path添加用程序的 helpers 的查询路径 添加来自应用程序,railties 和 engines 的路径,应用程序在这些路径中寻找 helpers。

load_config_initializers加载应用程序,railties 和 enginesconfig/initializers目录下的所有 Ruby 文件。这些文件用于容纳在框架加载完毕后被使用的配置设置。

engines_blanik_point提供初始化过程中的某个点来放置 hook, 然后你就可以让任何东西在 engines 之前被加载。在这个点之后,才轮到所有的 railtie 和 engine 运行。

add_generator_templates搜寻位于lib/templates为生成器所用的模板,这用于应用程序,所有的 railtie 和 engine 还有那些添加到config.gengrators.templates设置里的模板。这让所有这些模板都可被所有的生成器引用。

ensure_autoload_once_paths_as_subset确保config.autoload_once_paths只包含来自config.autoload_paths的路径。如果它包含其它路径,那么将会抛出一个异常。

add_to_prepare_blocks在应用程序,一个railtie 或者 engine 里的所有config.to_prepare调用的代码块会被添加到to_prepare所有 Action Dispatch 回调中去。这些回调在开发环境中的每个请求发生时都会运行,或者在生产环境中在只有在第一次请求发生时运行。

add_builtin_route如果应用程序运行在开发环境下,那么它会将rails/info/properties的路由添加到应用程序的路由中去. 一般的Rails应用里,这个路由提供了诸如 Rails 和 Ruby 的版本之类的信息显示于public/index.html.

build_middleware_stack建造应用程序的中间件堆栈, 返回一个又call方法的对象,这个方法带有请求的一个 Rack 环境对象.

eager_load!如果config.cache_classes为 true, 运行config.before_eager_loadhook 然后调用eager_load!, 它将会加载config.eager_load_paths里的所有 Ruby 文件.

finisher_hook为应用程序初始化过程完成后提供一个 hook, 和为应用程序, 所有的 railtie 和 engine 运行所有的config.after_initialize代码块一样.

set_routes_reloader配置 Action Dispatch 通过使用ActionDispatch::Callbacks.to_prepare重新加载所有的路由文件.

disable_dependency_loading如果config.cache_classes设置为 true 并且config.dependency_loading设置为 false, 那么取消自动加载依赖.

数据库连接池

Active Record 数据库连接是由ActiveRecord::ConnectionAdapters::ConnectionPool来管理的, 它会确保多个线程能同时访问有限的数据库连接. 这个限制默认是 5 个,可以在database.yml里配置.

<ruby style="color:rgb(51,51,51); font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:15px; line-height:25.5px"><p style="margin-top:15px; margin-bottom:15px">development:<br style=""> adapter: sqlite3<br style=""> database: db/development.sqlite3<br style=""> pool: 5<br style=""> timeout: 5000</p> </ruby>

因为连接池是默认由 ActiveRecord 内部处理的, 所有的应用程序服务器(Thin, mongrel, Unicorn 等等) 应该表现得一样. 最初, 数据库连接池是空的而且将会创建附加的连接作为它们增长的需求,知道它达到连接池的限制.

所有的请求在第一次需要访问数据库的时候都会签出一个连接, 随后将会将连接签入回去. 在请求结束的时候,也就意味着该附加连连接槽应该可以给队列中的下一个请求使用.

注意. 如果你启用了Rails.threadsafe!模式, 那么就有机会又数个线程同时访问多个连接. 所有根据你当前的请求量, 有多个线程竞争数量有限的连接也是没问题的.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics