配置 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 文件包括这个设置:

config.filter_parameters += [:password]

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

config.active_record.observers = [:hotel_observer, :review_observer]

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

一般的Rails配置

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

  • config.after_initialize 会接受一个代码块,这个代码块将会在 Rails 初始化应用程序完毕_之后_再运行. 那包括框架自身, 引擎和在+config/initializers+里的所有应用程序初始化程序的初始化.请注意这个代码块_将会_为rake任务运行. 在给其它初始化程序进行配置时会很有用:

config.after_initialize do
ActionView::Base.sanitized_allowed_tags.delete ‘div’
end

  • 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 是个字符串, 它应该是个带有 %s 的 sprintf 格式的字符串, path 会插入到 %s 的位置. 在任何情况下, Rails 输出布置好的路径. 这是 config.action_controller.asset_path简短版本.

config.asset_path = proc { |path| “/blog/public#{path}” }

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::FileUpdateChecker API.
  • 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 不处理会话. 也可以指定自定义会话存储:

config.session_store :my_custom_store

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

  • config.threadsafe! 激活 allow_concurrencycache_classesdependency_loading 和 preload_frameworks 来让应用程序实现线程安全。

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

  • config.time_zone 设置应用程序 Active Record 可用的默认时区。
  • config.whiny_nil 开启或取消当一些方法被 nil 调用且 nil 没有这些方法的时候抛出警告。在开发和测试环境都默认为 true.
  • config.console 让你设置当你运行 rails console 的时候用作控制台的类。
    它最好在 console 代码块下运行:

console do

  1. this block is called only when running console,
  2. so we can safely require pry here
    require “pry”
    config.console = Pry
    end
配置资源

Rails 3.1, 默认使用 sprockets gem 来管理资源。这个 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-compressor gem.
  • config.assets.js_compressor 定义要使用的 JavaScript 压缩器。很可能是 :closure:uglifier 和 :yui,分别需要使用到 closure-compileruglifier 或者 yui-compressor gem.
  • 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 方法修改生成器.这个方法接受一个代码块:

config.generators do |g|
g.orm :active_record
g.test_framework :test_unit
end

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

  • 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_check 和config.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 方法添加自己的:

config.middleware.use Magical::Unicorns

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

config.middleware.insert_before ActionDispatch::Head, Magical::Unicorns

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

config.middleware.insert_after ActionDispatch::Head, Magical::Unicorns

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

config.middleware.swap ActionDispatch::BestStandardsSupport, Magical::Unicorns

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

config.middleware.delete ActionDispatch::BestStandardsSupport

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

config.middleware.http_only!

通过这样做,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 的错误信息。默认为

Proc.new { |html_tag, instance| %Q(

#{html_tag}
).html_safe }
  • 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 导入标签被导入使用。默认情况下是这么定义的:

config.action_view.javascript_expansions = { :defaults => %w(jquery jquery_ujs) }

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

config.action_view.javascript_expansions[:prototype] = [‘prototype’, ‘effects’, ‘dragdrop’, ‘controls’]

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

<%= javascript_include_tag :prototype %>

  • config.action_view.stylesheet_expansions 跟 javascript_expansions 的工作方式差不多,但没有默认的项。在这个哈希数组定义的所有键都可以在视图里像这样引用:

<%= stylesheet_link_tag :special %>

  • 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 的默认值。这些默认值为:

    :mime_version => “1.0”,
    :charset => “UTF-8”,
    :content_type => “text/plain”,
    :parts_order => [ “text/plain”, “text/enriched”, “text/html” ]
  • config.action_mailer.observers 登记观察者,在邮件被发送时会作出提醒。

    config.action_mailer.observers = [“MailObserver”]
  • config.action_mailer.interceptors 登记拦截器,它会在邮件发送前被调用。

    config.action_mailer.interceptors = [“MailInterceptor”]
配置 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.behavior config.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+环境中,会在所有的请求上运行。而在 production 和 test 环境只会运行一次(启动的期间)。
  • before_eager_load: 在即时加载(eager loading)发生之前立即运行. 这是_生产_ 环境的默认行为,但在_开发_环境则不是。
  • after_initialize: 应用程序加载后立即运行,但在应用程序的初始化程序之前运行。

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

module YourApp
class Application < Rails::Application
config.before_initialize do

  1. initialization code goes here
    end
    end
    end

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

Rails.application.config.before_initialize do

  1. initialization code goes here
    end

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

Rails::Railtie#initializer

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

initializer “active_support.initialize_whiny_nils” do |app|
require ‘active_support/whiny_nil’ if app.config.whiny_nils
end

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_frameworks 为 true 或者 "可确定性的",那么将自动地加载所有 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.mechanism 去 require依赖而不是 load 它们。

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

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

active_support.initialize_whiny_nils 在 config.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_ids 为 false, 但前提是 config.cache_classes 也有加载。

active_view.javascript_expansions 登记由 config.active_view.javascript_expansions 和config.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. 而这个初始化程序是将方法名作为 setters send 给 ActionController::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. 而这个初始化程序是将方法名作为 setters send 给 ActionRecord::Base 并通过它传值来使用 config.active_record 的设置的。

active_record.initialize_database 从 config/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. 而这个初始化程序是将方法名作为 setterssend 给 ActionMailer::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 和 engines config/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_load hook 然后调用 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 里配置.

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值