首页
/ Ruby on Rails 3.2 发行说明详解:更快的开发模式、路由引擎、自动查询 EXPLAIN 与标签日志

Ruby on Rails 3.2 发行说明详解:更快的开发模式、路由引擎、自动查询 EXPLAIN 与标签日志

2026-09-06 10:12:26作者:卓炯娓

本文围绕 Rails 官方仓库中的 3.2 发行说明 展开,完整覆盖该版本的主要变更:升级路径与必备配置、四大亮点特性(更快的开发模式、Journey 新路由引擎、自动查询解释、Tagged Logging),以及 Railties、Action Pack、Active Record、Active Support 等各框架的逐项变更与弃用清单。读完本文,你可以掌握从 Rails 3.1 平滑升级至 3.2 的全部实操要点,并能在当前仓库源码中找到这些特性的落地实现作为印证。

版本亮点总览

Rails 3.2 的四大核心亮点(原文档 Highlights):

  • Faster Development Mode——更快的开发模式,只在依赖文件真正变化时才重载类;
  • New Routing Engine——基于 Journey 的新路由引擎,路由匹配(route recognition)速度大幅提升;
  • Automatic Query Explains——慢查询自动 EXPLAIN,并可手动调用 Relation#explain
  • Tagged Logging——Active Support 提供的标签日志,为日志行打上子域、请求 ID 等标记。

需要说明的是,发行说明只覆盖主要变更;更细粒度的 bug 修复与行为变化请参考各框架的 CHANGELOG(当前仓库中各框架目录下均有独立的 CHANGELOG 文件,如 Active Support CHANGELOGActive Record CHANGELOG)。

升级指南:从 3.1 升到 3.2

如果准备升级现有应用,官方建议遵循以下路径:先保证应用有充分的测试覆盖;如果还没升过,先升级到 Rails 3.1 并确认应用行为正常,再尝试升级到 3.2。

运行环境要求

Rails 3.2 要求至少 Ruby 1.8.7,早期 Ruby 版本的支持被正式移除,应用应与 3.2 兼容 Ruby 1.9.2。官方提示(TIP):

  • Ruby 1.8.7 p248 与 p249 存在会导致 Rails 崩溃的 marshalling bug;Ruby Enterprise Edition 自 1.8.7-2010.02 起已修复;
  • Ruby 1.9.1 因会直接 segfault 而不可用,想使用 1.9.x 系列请上 1.9.2 或 1.9.3。

应用需要更新的依赖

升级应用时,将 Gemfile 更新为依赖:

  • rails = 3.2.0
  • sass-rails ~> 3.2.3
  • coffee-rails ~> 3.2.1
  • uglifier >= 1.0.3

同时注意:Rails 3.2 弃用了 vendor/plugins(Rails 4.0 将彻底移除)。推荐做法是把插件抽取为 gem 并加入 Gemfile;如果不想做成 gem,可以移到 lib/my_plugin/* 下,并在 config/initializers/my_plugin.rb 中添加相应的初始化代码。

环境配置新增项

config/environments/development.rb 中加入两项新配置:

# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict

# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
config.active_record.auto_explain_threshold_in_seconds = 0.5

mass_assignment_sanitizer 同样需要加到 config/environments/test.rb

# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict

这两项配置对应 Active Model / Active Record 的新特性::strict 模式下,命中 attr_accessible 保护的大规模赋值会直接抛异常(默认行为为 :logger,仅记录警告);auto_explain_threshold_in_seconds 则是自动查询解释的触发阈值,详见下文。

引擎(Engine)需要更新的内容

script/rails 中注释行之后的代码替换为:

ENGINE_ROOT = File.expand_path('../..', __FILE__)
ENGINE_PATH = File.expand_path('../../lib/your_engine_name/engine', __FILE__)

require "rails/all"
require "rails/engine/commands"

创建 Rails 3.2 应用

# You should have the 'rails' RubyGem installed
$ rails new myapp
$ cd myapp

Gem 的 Vendoring

Rails 应用根目录使用 Gemfile 声明启动所需的全部 gem,由 Bundler 负责解析与安装;Bundler 甚至可以把所有依赖本地安装到应用目录内,使应用不再依赖系统 gem。

Living on the Edge

得益于 Bundler 和 Gemfile,"冻结"(freeze)Rails 应用变得非常简单。如果想直接从 Git 仓库 bundle,可传 --edge 参数:

$ rails new myapp --edge

如果手头有本地 Rails 仓库 checkout,想用本地代码生成应用,可传 --dev 参数:

$ ruby /path/to/rails/railties/bin/rails new myapp --dev

主要特性深入解析

1. 更快的开发模式与路由引擎

Rails 3.2 的开发模式明显更快,其灵感来自 Active Reload:只有当依赖文件真正发生变化时才重载类,大型应用上的性能收益是显著性的。这一开关由 Railties 的 config.reload_classes_only_on_change 控制,设为 false 可以关闭该行为(见下文 Railties 章节)。

路由匹配(route recognition)则因新路由引擎 Journey 而获得大幅提速。在当前仓库中,Journey 已被整合进 Action Pack 的路由分发层,入口为 actionpack/lib/action_dispatch/journey.rb,其下有 routergtg/buildergtg/simulator 等模块负责路由表的构建与请求的解析匹配;journey 目录下的 路由语法说明模板 也保留了引擎的语法规约文档。

2. 自动查询解释(Automatic Query Explains)

Rails 3.2 通过 ActiveRecord::Relation 上新增的 explain 方法,允许对 Arel 生成的查询执行 EXPLAIN,例如:

puts Person.active.limit(5).explain

这有助于检查索引是否合理、还有哪些优化空间。当前仓库中该方法仍然存在,定义见 activerecord/lib/active_record/relation.rb,各适配器分别在 database_statements.rb 中实现 EXPLAIN 的执行(如 PostgreSQL 适配器SQLite3 适配器 与抽象基类中的 默认实现)。

除手动调用外,开发模式下运行超过半秒的查询会被自动 EXPLAIN 并写入日志。控制参数为 config.active_record.auto_explain_threshold_in_seconds

  • 设为 nil 即禁用该功能;
  • 默认值:development 模式为 0.5,test 与 production 模式为 nil
  • 3.2 版本中该功能支持 SQLite、MySQL(mysql2 适配器)与 PostgreSQL。

配合的 API 还有 ActiveRecord::Base.silence_auto_explain,可以在一个代码块内临时关闭自动 EXPLAIN,避免噪声。

3. 标签日志(Tagged Logging)

运行多用户、多账号应用时,按"谁做了什么"过滤日志极为有用。Active Support 的 ActiveSupport::TaggedLogging 正好解决这一问题:它给日志行打上子域名、请求 ID 等任意标记。

用法示例(原文档):

Logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))

Logger.tagged("BCX") { Logger.info "Stuff" }
# Logs "[BCX] Stuff"

Logger.tagged("BCX", "Jason") { Logger.info "Stuff" }
# Logs "[BCX] [Jason] Stuff"

Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info "Stuff" } }
# Logs "[BCX] [Jason] Stuff"

当前仓库中的实现位于 activesupport/lib/active_support/tagged_logging.rb,从源码结构看其核心设计是:TaggedLogging.new(logger) 克隆传入的 Logger 并克隆其 formatter,然后向 formatter 混入 Formatter 模块——每次日志事件发生时由 Formatter#calltag_stack.format_message(msg) 把标签拼到消息前;TagStack(同文件 L75-L111)维护一个标签栈,push_tags 会去空(reject!(&:blank?))、format_message[tag1] [tag2] message 的格式拼接并缓存结果串。标签栈的存储使用 IsolatedExecutionState 按线程隔离,因此多线程环境下各请求的标签互不串扰。此外还支持无 block 的链式调用:logger.tagged("BCX").info "Stuff" 会返回一个带标签的新 logger 实例。对应的行为测试见 activesupport/test/tagged_logging_test.rb

这一能力与 Railties 层打通:Rails::Rack::Logger 中间件会把 config.log_tags 中设置的标签应用到 ActiveSupport::TaggedLogging 上,使得用子域、请求 ID 等调试信息给日志行打标签变得非常顺手——这正是多用户生产环境排障的关键手段。

各框架变更明细

Railties

  • 只有依赖文件变化时才重载类以加速开发;可将 config.reload_classes_only_on_change 设为 false 关闭。

  • 新建应用的环境配置文件中带有 config.active_record.auto_explain_threshold_in_seconds 标志:development.rb 中值为 0.5production.rb 中为注释状态,test.rb 中不提。

  • 新增 config.exceptions_app,用于设置 ShowException 中间件在异常发生时调用的异常应用。默认值为 ActionDispatch::PublicExceptions.new(Rails.public_path)。该配置在当前仓库中仍保留于应用配置项声明中,见 railties/lib/rails/application/configuration.rb,且默认中间件栈的装配逻辑见 railties/lib/rails/application/default_middleware_stack.rb

  • 新增 DebugExceptions 中间件,包含从 ShowExceptions 中间件抽取出的功能。

  • rake routes 会显示挂载引擎(mounted engines)的路由。

  • 允许通过 config.railties_order 改变 railties 的加载顺序,例如:

    config.railties_order = [Blog::Engine, :main_app, :all]
    

    该配置项及其用法文档保留在 railties/lib/rails/engine.rb

  • 脚手架(scaffold)对无内容的 API 请求返回 204 No Content,使 scaffold 开箱即用兼容 jQuery。

  • 更新 Rails::Rack::Logger 中间件,将 config.log_tags 中设置的标签应用到 ActiveSupport::TaggedLogging(上文已详述)。

  • rails new 的默认选项可以写在 ~/.railsrc 中:该文件里的参数会在每次执行 rails new 时作为额外的命令行参数生效。

  • destroy 增加别名 d,对引擎同样生效。

  • 脚手架与模型生成器的属性默认类型为 string,例如:bin/rails g scaffold Post title body:text author

  • 允许 scaffold/model/migration 生成器接受 indexuniq 修饰符,例如:

    $ bin/rails g scaffold Post title:string:index author:uniq price:decimal{7,2}
    

    这会为 titleauthor 创建索引,后者为唯一索引;部分类型如 decimal 接受自定义选项——示例中 price 将生成精度 7、小数位 2 的 decimal 列。

  • turn gem 已从默认 Gemfile 中移除。

  • 移除旧插件生成器 rails generate plugin,改用 rails plugin new 命令。

  • 移除旧的 config.paths.app.controller API,改用 config.paths["app/controller"]

弃用项

  • Rails::Plugin 被弃用,将在 Rails 4.0 移除。不要再往 vendor/plugins 里加插件,应改用 gem 或 Bundler 的 path / git 依赖。

Action Mailer

  • 升级 mail gem 至 2.4.0 版本。
  • 移除了自 Rails 3.0 起就已弃用的旧版 Action Mailer API。

Action Pack

Action Controller

  • ActiveSupport::Benchmarkable 成为 ActionController::Base 的默认模块,#benchmark 方法在控制器上下文中恢复可用。

  • caches_page 新增 :gzip 选项;全局默认值可用 page_cache_compression 配置。

  • 当用 :only / :except 条件指定 layout 且条件不满足时,Rails 会回退使用默认 layout(如 layouts/application):

    class CarsController
      layout 'single_car', :only => :show
    end
    

    请求打到 :show 动作时使用 layouts/single_car,其他动作则使用 layouts/application(或存在的 layouts/cars)。

  • 提供 :as 选项时,form_for 改用 #{action}_#{as} 作为 CSS class 与 id(早期版本使用 #{as}_#{action})。

  • ActionController::ParamsWrapper 对 Active Record 模型只在 attr_accessible 属性被设置时才包裹它们;否则只包裹类方法 attribute_names 返回的属性。此修复通过把嵌套属性加入 attr_accessible 来修正嵌套属性的包裹问题。

  • 每次 before 回调中止时,记录日志 "Filter chain halted as CALLBACKNAME rendered or redirected"。

  • ActionDispatch::ShowExceptions 被重构:由控制器负责决定是否展示异常;可以在控制器中覆写 show_detailed_exceptions? 来指定哪些请求在出错时提供调试信息。

  • Responders 对无响应体的 API 请求返回 204 No Content(与新版 scaffold 一致)。

  • ActionController::TestCase 的 cookies 被重构。测试中赋值 cookie 应改用 cookies[]

    cookies[:email] = 'user@example.com'
    get :index
    assert_equal 'user@example.com', cookies[:email]
    

    清除 cookie 使用 clear

    cookies.clear
    get :index
    assert_nil cookies[:email]
    

    不再写出 HTTP_COOKIE,cookie jar 在请求之间持久存在;如需操纵环境变量,必须在 cookie jar 创建之前进行。

  • 未提供 :type 时,send_file 会从文件扩展名推断 MIME 类型。

  • 新增 PDF、ZIP 等格式的 MIME 类型条目。

  • fresh_when / stale? 现在可以直接接受 record 而不是 options hash。

  • 缺少 CSRF token 的警告日志级别从 :debug 提升为 :warn

  • 资产(assets)默认使用请求协议;无请求可用时默认为相对路径。

Action Controller 弃用项

  • 弃用"父控制器显式设置了 layout 时子控制器隐式查找 layout"的行为:

    class ApplicationController
      layout "application"
    end
    
    class PostsController < ApplicationController
    end
    

    上例中 PostsController 不再自动查找 posts layout;若需要该功能,可移除 ApplicationController 中的 layout "application",或在 PostsController 中显式置为 nil

  • 弃用 ActionController::UnknownAction,改用 AbstractController::ActionNotFound

  • 弃用 ActionController::DoubleRenderError,改用 AbstractController::DoubleRenderError

  • 缺少 action 时的处理由 method_missing 弃用,改用 action_missing

  • 弃用 ActionController#rescue_actionActionController#initialize_template_classActionController#assign_shortcuts

Action Dispatch

  • 新增 config.action_dispatch.default_charset,用于配置 ActionDispatch::Response 的默认字符集。
  • 新增 ActionDispatch::RequestId 中间件:为响应提供唯一的 X-Request-Id 头,并使 ActionDispatch::Request#uuid 方法可用——便于在整条技术栈中端到端追踪单个请求,以及在 Syslog 这类混合日志中识别单个请求。
  • ShowExceptions 中间件现在接受一个"异常应用"(exceptions application),由它负责在应用失败时渲染异常:该应用被调用时会拿到 env["action_dispatch.exception"] 中的异常副本,且 PATH_INFO 被改写为对应的状态码路径。
  • 允许通过 railtie 配置 rescue 响应,即 config.action_dispatch.rescue_responses

Action Dispatch 弃用项

  • 弃用在控制器级别设置默认字符集的做法,请改用 config.action_dispatch.default_charset

Action View

  • ActionView::Helpers::FormBuilder 支持 button_tag,行为仿照 submit_tag 的默认行为:

    <%= form_for @post do |f| %>
      <%= f.button %>
    <% end %>
    
  • 日期辅助方法接受新选项 :use_two_digit_numbers => true,为月和日的选择框渲染带前导零的两位数字,同时不改变实际取值——适合展示 ISO 8601 风格日期(如 '2011-08-01')。

  • 可为表单提供命名空间(namespace)以保证表单元素 id 的唯一性,生成的 HTML id 会以带下划线的命名空间作前缀:

    <%= form_for(@offer, :namespace => 'namespace') do |f| %>
      <%= f.label :version, 'Version' %>:
      <%= f.text_field :version %>
    <% end %>
    
  • select_year 的选项数量被限制为 1000,可传 :max_years_allowed 选项自定义上限。

  • content_tag_fordiv_for 现在可以接受记录集合;若 block 声明了接收参数,会以 record 作为第一个参数 yield。不再需要这样写:

    @items.each do |item|
      content_tag_for(:li, item) do
        Title: <%= item.title %>
      end
    end
    

    可以直接写成:

    content_tag_for(:li, @items) do |item|
      Title: <%= item.title %>
    end
    
  • 新增 font_path 辅助方法,计算 public/fonts 下字体资产的路径。

Action View 弃用项

  • render :template 及同类方法传递 formats 或 handlers(如 render :template => "foo.html.erb")被弃用。应直接提供 :handlers:formats 选项:render :template => "foo", :formats => [:html, :js], :handlers => :erb

Sprockets

  • 新增配置项 config.assets.logger 用于控制 Sprockets 的日志输出:设为 false 关闭日志,设为 nil 则回落到 Rails.logger

Active Record

  • 值为 'on''ON' 的布尔列会被类型转换为 true

  • timestamps 方法创建的 created_atupdated_at 列默认不可为空(non-nullable)。

  • 实现 ActiveRecord::Relation#explain(见上文"自动查询解释")。

  • 实现 ActiveRecord::Base.silence_auto_explain,允许在代码块内选择性禁用自动 EXPLAIN。

  • 实现慢查询的自动 EXPLAIN 日志。新配置参数 config.active_record.auto_explain_threshold_in_seconds 决定什么算慢查询;设为 nil 禁用。默认 development 为 0.5,test 与 production 为 nil。3.2 支持 SQLite、MySQL(mysql2 适配器)、PostgreSQL。

  • 新增 ActiveRecord::Base.store,用于声明简单的单列键值存储:

    class User < ActiveRecord::Base
      store :settings, accessors: [ :color, :homepage ]
    end
    
    u = User.new(color: 'black', homepage: '37signals.com')
    u.color                          # Accessor stored attribute
    u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor
    
  • 支持按给定 scope 只运行部分迁移,例如只跑某个引擎的迁移(比如回滚一个需要移除的引擎的改动):

    rake db:migrate SCOPE=blog
    
  • 从引擎拷贝出的迁移现在会带上引擎名前缀,例如 01_create_posts.blog.rb

  • 实现 ActiveRecord::Relation#pluck,直接从底层表返回列值数组,对序列化属性同样有效:

    Client.where(:active => true).pluck(:id)
    # SELECT id from clients where active = 1
    

    当前仓库中 pluck 的实现见 activerecord/lib/active_record/relation/calculations.rb关联代理

  • 生成的关联方法被放进独立模块以支持覆写与组合。对名为 MyModel 的类,该模块名为 MyModel::GeneratedFeatureMethods,它在 Active Model 定义的 generated_attributes_methods 模块之后立即被 include 进模型类,因此关联方法会覆写同名的属性方法。

  • 新增 ActiveRecord::Relation#uniq 用于生成去重查询:

    Client.select('DISTINCT name')
    

    可以写成:

    Client.select(:name).uniq
    

    并且可以再次反转唯一性:

    Client.select(:name).uniq.uniq(false)
    
  • SQLite、MySQL 与 PostgreSQL 适配器支持索引排序(index sort order)。

  • 关联的 :class_name 选项除了字符串外还接受符号,避免新手困惑,并与 :foreign_key 等选项的取值方式保持一致:

    has_many :clients, :class_name => :Client # 注意符号需要大写开头
    
  • 开发模式下 db:drop 会连带删除测试库,与 db:create 保持对称。

  • 大小写不敏感的 uniqueness 校验在 MySQL 下,若列已经使用大小写不敏感的 collation,就不再调用 LOWER。

  • 事务性 fixture(transactional fixtures)会登记所有活动的数据库连接,因此可以在不同连接上测试模型而无需禁用 transactional fixtures。

  • 为 Active Record 增加 first_or_createfirst_or_create!first_or_initialize 方法。相比旧的 find_or_create_by 动态方法,它更清楚地表明哪些参数用于查找、哪些用于创建:

    User.where(:first_name => "Scarlett").first_or_create!(:last_name => "Johansson")
    

    当前仓库中 first_or_create 系列定义见 activerecord/lib/active_record/relation.rb

  • 为 Active Record 对象新增 with_lock 方法:开启事务、对对象加悲观锁,并把对象 yield 给 block;方法接收一个可选参数并传递给 lock!。原来的写法:

    class Order < ActiveRecord::Base
      def cancel!
        transaction do
          lock!
          # ... cancelling logic
        end
      end
    end
    

    可以简化为:

    class Order < ActiveRecord::Base
      def cancel!
        with_lock do
          # ... cancelling logic
        end
      end
    end
    

    with_lock 的实现至今保留在 activerecord/lib/active_record/locking/pessimistic.rb

Active Record 弃用项

  • 弃用线程中连接自动关闭的行为,例如以下代码被弃用:

    Thread.new { Post.find(1) }.join
    

    应改为在线程结束时显式关闭数据库连接:

    Thread.new {
      Post.find(1)
      Post.connection.close
    }.join
    

    只有在应用代码里自行创建线程的人需要关心此变更。

  • set_table_nameset_inheritance_columnset_sequence_nameset_primary_keyset_locking_column 被弃用,改用赋值方法。例如不再使用 set_table_name,而是使用 self.table_name=

    class Project < ActiveRecord::Base
      self.table_name = "project"
    end
    

    或者自定义 self.table_name 方法:

    class Post < ActiveRecord::Base
      def self.table_name
        "special_" + super
      end
    end
    
    Post.table_name # => "special_posts"
    

Active Model

  • 新增 ActiveModel::Errors#added?,用于检查某个具体错误是否已添加。
  • 新增严格校验(strict validations):strict => true 时校验失败总是抛出异常。
  • 提供 mass_assignment_sanitizer 作为替换 sanitizer 行为的简便 API,同时支持 :logger(默认)与 :strict 两种 sanitizer 行为。

Active Model 弃用项

  • ActiveModel::AttributeMethods 中的 define_attr_method 被弃用——它当初只是为了支持 Active Record 中 set_table_name 之类的方法,而这些方法本身也在被弃用。
  • 弃用 Model.model_name.partial_path,改用 model.to_partial_path

Active Resource

  • 重定向响应 303 See Other 与 307 Temporary Redirect 的行为现在与 301 Moved Permanently 和 302 Found 一致。

Active Support

  • 新增 ActiveSupport::TaggedLogging,可包装任意标准 Logger 类以提供标签能力(示例代码见上文"标签日志"一节;实现与测试分别在 activesupport/lib/active_support/tagged_logging.rbactivesupport/test/tagged_logging_test.rb)。

  • DateTimeDateTimebeginning_of_week 方法接受一个可选参数,表示假定的一周起始日。

  • ActiveSupport::Notifications.subscribed 提供"在 block 执行期间订阅事件"的能力。

  • 定义新方法 Module#qualified_const_defined?Module#qualified_const_getModule#qualified_const_set,与标准 API 对应方法类似,但接受限定常量名(qualified constant names)。

  • 新增 #deconstantize,与 #demodulize 互补,去掉限定常量名中最右侧的一段。

  • 新增 safe_constantize:把字符串常量化的同时,若常量(或其某一部分)不存在则返回 nil 而不是抛异常。

  • ActiveSupport::OrderedHash 在使用 Array#extract_options! 时被标记为可提取(extractable)。

  • 新增 Array#prepend 作为 Array#unshift 的别名、Array#append 作为 Array#<< 的别名。

  • Ruby 1.9 下空白字符串的定义扩展到 Unicode 空白字符;Ruby 1.8 下全角空格 U+3000 也被视为空白。

  • 词干变化器(inflector)开始理解缩写词(acronyms)。

  • 新增 Time#all_dayTime#all_weekTime#all_quarterTime#all_year,用于生成范围:

    Event.where(:created_at => Time.now.all_week)
    Event.where(:created_at => Time.now.all_day)
    
  • Class#cattr_accessor 等方法新增 instance_accessor: false 选项。

  • ActiveSupport::OrderedHash 对"以 splat 接收参数的 block"的 #each#each_pair 行为有了区分。

  • 新增 ActiveSupport::Cache::NullStore,供开发与测试使用。

  • 移除 ActiveSupport::SecureRandom,改用标准库的 SecureRandom

Active Support 弃用项

  • ActiveSupport::Base64 弃用,改用 ::Base64

  • 弃用 ActiveSupport::Memoizable,建议直接使用 Ruby 的记忆化(memoization)惯用法。

  • Module#synchronize 弃用且无替代方案,请使用 Ruby 标准库的 monitor。

  • 弃用 ActiveSupport::MessageEncryptor#encrypt#decrypt

  • ActiveSupport::BufferedLogger#silence 弃用。想抑制某个 block 的日志,请改为在该 block 中调整日志级别。

  • ActiveSupport::BufferedLogger#open_log 弃用——该方法本不该是公开的。

  • ActiveSupport::BufferedLogger 自动为日志文件创建目录的行为被弃用,请在实例化前自行创建目录。

  • ActiveSupport::BufferedLogger#auto_flushing 弃用:请对底层文件句柄设置 sync 级别,例如:

    f = File.open('foo.log', 'w')
    f.sync = true
    ActiveSupport::BufferedLogger.new f
    
  • ActiveSupport::BufferedLogger#flush 弃用:设置文件句柄的 sync,或调优文件系统。

与当前仓库的对照说明

以上变更均以 Rails 3.2 发行说明原文为准,适用前提是运行 Rails 3.2 系列应用。当前仓库是 Rails 的主干源码,其中这些 3.2 特性大多仍在演进并保留可用:TaggedLogging 的模块化包装器结构(activesupport/lib/active_support/tagged_logging.rb)、Relation#explainactiverecord/lib/active_record/relation.rb)、pluck / with_lock / first_or_create 系列、config.exceptions_appconfig.railties_orderrailties/lib/rails/application/configuration.rb)等,都可以在仓库源码中直接检索到,作为理解这些经典特性的第一手实现依据。

登录后查看全文
热门项目推荐
相关项目推荐