更多内容请访问 rubyonrails.org:

Ruby on Rails 3.0 发布说明

Rails 3.0 充满了小马和彩虹!它会为你做饭、叠衣服。你会疑惑在它到来之前生活是如何可能的。这是我们有史以来最好的 Rails 版本!

但现在说真的,它确实是好东西。Merb 团队加入后带来了所有好主意,并专注于框架无关性、更精简更快的内部结构以及一系列美味的 API。如果你是从 Merb 1.x 转向 Rails 3.0,你会认出很多东西。如果你是从 Rails 2.x 转向,你也会爱上它。

即使你对我们的内部清理毫不关心,Rails 3.0 也会让你感到高兴。我们有一堆新功能和改进的 API。现在是成为 Rails 开发人员的最佳时机。一些亮点包括

  • 全新的路由器,重点放在 RESTful 声明上
  • 新的 Action Mailer API,模仿 Action Controller(现在发送 multipart 消息不再痛苦!)
  • 新的 Active Record 可链式查询语言,构建在关系代数之上
  • 非侵入式 JavaScript 助手,支持 Prototype、jQuery,并且更多即将推出(结束内联 JS)
  • 使用 Bundler 进行显式依赖管理

最重要的是,我们尽力用友好的警告来弃用旧的 API。这意味着你可以将现有应用程序迁移到 Rails 3,而无需立即将所有旧代码重写为最新的最佳实践。

这些发布说明涵盖了主要升级,但不包括每一个小错误修复和更改。Rails 3.0 包含近 4,000 次提交,由 250 多位作者完成!如果你想查看所有内容,请查看 GitHub 上主 Rails 仓库中的提交列表

安装 Rails 3

# Use sudo if your setup requires it
$ gem install rails

1. 升级到 Rails 3

如果你正在升级现有应用程序,最好在开始之前进行良好的测试覆盖。你还应该首先升级到 Rails 2.3.5,并确保你的应用程序在尝试更新到 Rails 3 之前仍按预期运行。然后注意以下更改

1.1. Rails 3 至少需要 Ruby 1.8.7

Rails 3.0 需要 Ruby 1.8.7 或更高版本。对所有以前 Ruby 版本的支持已正式终止,你应该尽快升级。Rails 3.0 也兼容 Ruby 1.9.2。

请注意,Ruby 1.8.7 p248 和 p249 存在 marshaling 错误,会导致 Rails 3.0 崩溃。不过,Ruby Enterprise Edition 从 1.8.7-2010.02 版本开始已修复这些问题。在 1.9 方面,Ruby 1.9.1 不可用,因为它在 Rails 3.0 上会直接段错误,因此如果你想在 1.9.x 中使用 Rails 3,请选择 1.9.2 以便顺利运行。

1.2. Rails 应用程序对象

作为支持在同一进程中运行多个 Rails 应用程序的基础工作的一部分,Rails 3 引入了应用程序对象的概念。应用程序对象包含所有应用程序特定的配置,本质上与以前版本的 Rails 中的 config/environment.rb 非常相似。

现在每个 Rails 应用程序都必须有一个相应的应用程序对象。应用程序对象在 config/application.rb 中定义。如果你正在将现有应用程序升级到 Rails 3,则必须添加此文件并将适当的配置从 config/environment.rb 移动到 config/application.rb

1.3. script/* 被 script/rails 替换

新的 script/rails 替换了以前在 script 目录中的所有脚本。不过,你不能直接运行 script/railsrails 命令会检测它是否在 Rails 应用程序的根目录中被调用,并为你运行脚本。预期的用法是

$ rails console                      # instead of script/console
$ rails g scaffold post title:string # instead of script/generate scaffold post title:string

运行 rails --help 获取所有选项的列表。

1.4. 依赖项和 config.gem

config.gem 方法已移除,并已替换为使用 bundlerGemfile,请参见下面的Vendoring Gems

1.5. 升级过程

为了帮助升级过程,我们创建了一个名为 Rails Upgrade 的插件,以自动化部分工作。

只需安装插件,然后运行 rake rails:upgrade:check 来检查你的应用程序中需要更新的部分(并提供如何更新它们的链接)。它还提供一个任务,根据你当前的 config.gem 调用生成一个 Gemfile,以及一个任务,从你当前的文件生成一个新的路由文件。要获取该插件,只需运行以下命令

$ ruby script/plugin install git://github.com/rails/rails_upgrade.git

你可以在Rails Upgrade 现已成为官方插件查看其工作示例

除了 Rails Upgrade 工具之外,如果你需要更多帮助,IRC 和 rubyonrails-talk 上可能也有人在做同样的事情,可能会遇到同样的问题。升级时务必撰写博客分享你的经验,这样其他人就可以从你的知识中受益!

2. 创建 Rails 3.0 应用程序

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

2.1. 嵌入 Gem

Rails 现在在应用程序根目录中使用 Gemfile 来确定你的应用程序启动所需的 gem。这个 GemfileBundler 处理,然后 Bundler 会安装所有依赖项。它甚至可以将所有依赖项本地安装到你的应用程序,这样它就不依赖于系统 gem。

更多信息: - bundler 主页

2.2. 前沿开发

BundlerGemfile 使冻结 Rails 应用程序变得轻而易举,借助新的专用 bundle 命令,rake freeze 不再相关并已被删除。

如果你想直接从 Git 仓库捆绑,可以传递 --edge 标志

$ rails new myapp --edge

如果您本地签出了 Rails 仓库并希望使用它生成应用程序,您可以传递 --dev 标志

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

3. Rails 架构变更

Rails 的架构有六个主要变化。

3.1. Railties 重构

Railties 进行了更新,为整个 Rails 框架提供了统一的插件 API,并彻底重写了生成器和 Rails 绑定,结果是开发人员现在可以以一致、定义明确的方式挂接到生成器和应用程序框架的任何重要阶段。

3.2. 所有 Rails 核心组件均已解耦

随着 Merb 和 Rails 的合并,一项重要工作是消除 Rails 核心组件之间的紧密耦合。现在这已经实现,所有 Rails 核心组件现在都使用你可以用于开发插件的相同 API。这意味着你制作的任何插件,或任何核心组件替换(如 DataMapper 或 Sequel)都可以访问 Rails 核心组件所能访问的所有功能,并随意扩展和增强。

更多信息: - 大解耦

3.3. Active Model 抽象

解耦核心组件的一部分是从 Action Pack 中提取所有与 Active Record 的联系。现在这已经完成。所有新的 ORM 插件现在只需实现 Active Model 接口即可与 Action Pack 无缝协作。

更多信息: - 让任何 Ruby 对象感觉像 ActiveRecord

3.4. Controller 抽象

解耦核心组件的另一个重要部分是创建一个与 HTTP 概念分离的基础超类,以处理视图渲染等。这个 AbstractController 的创建使得 ActionControllerActionMailer 得以大大简化,通用代码从所有这些库中移除并放入 Abstract Controller 中。

更多信息: - Rails Edge 架构

3.5. Arel 集成

Arel(或 Active Relation)已被用作 Active Record 的基础,现在是 Rails 的必需品。Arel 提供了一个 SQL 抽象,它简化了 Active Record 并为 Active Record 中的关系功能提供了基础。

更多信息: - 我为什么要写 Arel

3.6. Mail 提取

Action Mailer 从一开始就存在 monkey patches、预解析器,甚至交付和接收代理,此外还在源代码树中包含 TMail。版本 3 改变了这一点,所有与电子邮件消息相关的功能都被抽象到 Mail gem 中。这再次减少了代码重复,并有助于在 Action Mailer 和电子邮件解析器之间创建可定义的边界。

更多信息: - Rails 3 中的新 Action Mailer API

4. 文档

Rails 树中的文档正在更新所有 API 更改,此外,Rails Edge 指南正在逐一更新以反映 Rails 3.0 中的更改。然而,guides.rubyonrails.org 上的指南将继续仅包含 Rails 的稳定版本(目前是 2.3.5 版,直到 3.0 发布)。

更多信息: - Rails 文档项目

5. 国际化

Rails 3 在 I18n 支持方面做了大量工作,包括最新的 I18n gem 提供了许多速度改进。

  • 任何对象的 I18n - 通过包含 ActiveModel::TranslationActiveModel::Validations 可以将 I18n 行为添加到任何对象。还有用于翻译的 errors.messages 回退。
  • 属性可以有默认翻译。
  • 表单提交标签会根据对象状态自动拉取正确的状态(创建或更新),从而拉取正确的翻译。
  • 带 I18n 的标签现在也只需传递属性名称即可工作。

更多信息: - Rails 3 I18n 变更

6. Railties

随着主要 Rails 框架的解耦,Railties 进行了大规模改造,以使框架、引擎或插件的连接尽可能地无痛和可扩展

  • 每个应用程序现在都有自己的命名空间,例如,应用程序以 YourAppName.boot 启动,这使得与其他应用程序的交互变得容易得多。
  • Rails.root/app 下的任何内容现在都已添加到加载路径中,因此你可以创建 app/observers/user_observer.rb,Rails 将无需任何修改即可加载它。
  • Rails 3.0 现在提供了一个 Rails.config 对象,它提供了各种 Rails 范围配置选项的中央存储库。

    应用程序生成已收到额外的标志,允许你跳过 test-unit、Active Record、Prototype 和 Git 的安装。此外,还添加了一个新的 --dev 标志,它将应用程序设置为 Gemfile 指向你的 Rails 检出(由 rails 二进制文件的路径确定)。有关更多信息,请参阅 rails --help

Rails 3.0 中 Railties 生成器受到了大量关注,基本上

  • 生成器已完全重写,并且不向后兼容。
  • Rails 模板 API 和生成器 API 已合并(它们与前者相同)。
  • 生成器不再从特殊路径加载,它们只是在 Ruby 加载路径中找到,因此调用 rails generate foo 将查找 generators/foo_generator
  • 新生成器提供挂钩,因此任何模板引擎、ORM、测试框架都可以轻松接入。
  • 新生成器允许你通过在 Rails.root/lib/templates 放置副本覆盖模板。
  • 还提供了 Rails::Generators::TestCase,以便你可以创建自己的生成器并进行测试。

此外,Railties 生成器生成的视图也进行了一些改造

  • 视图现在使用 div 标签而不是 p 标签。
  • 现在生成的脚手架使用 _form 部分,而不是在编辑和新建视图中重复代码。
  • 脚手架表单现在使用 f.submit,它根据传入对象的状态返回“创建模型名称”或“更新模型名称”。

最后,对 rake 任务添加了一些增强功能

  • 添加了 rake db:forward,允许你单独或分组地向前滚动迁移。
  • 添加了 rake routes CONTROLLER=x,允许你只查看一个控制器的路由。

Railties 现在弃用

  • RAILS_ROOT 赞成使用 Rails.root
  • RAILS_ENV 赞成使用 Rails.env,以及
  • RAILS_DEFAULT_LOGGER 赞成使用 Rails.logger

PLUGIN/rails/tasksPLUGIN/tasks 不再加载,所有任务现在都必须在 PLUGIN/lib/tasks 中。

更多信息

7. Action Pack

Action Pack 在内部和外部都有显著变化。

7.1. 抽象控制器

抽象控制器将 Action Controller 的通用部分提取到一个可重用模块中,任何库都可以使用它来渲染模板、渲染局部视图、助手、翻译、日志记录,请求响应周期的任何部分。这种抽象使得 ActionMailer::Base 现在只需继承 AbstractController 并将 Rails DSL 包装到 Mail gem 上。

它还提供了清理 Action Controller 的机会,抽象出可以简化代码的部分。

但是请注意,抽象控制器不是用户可见的 API,你在日常使用 Rails 时不会遇到它。

更多信息: - Rails Edge 架构

7.2. Action Controller

  • application_controller.rb 现在默认开启 protect_from_forgery
  • cookie_verifier_secret 已被弃用,现在通过 Rails.application.config.cookie_secret 分配并移至其自己的文件:config/initializers/cookie_verification_secret.rb
  • session_store 以前在 ActionController::Base.session 中配置,现在已移至 Rails.application.config.session_store。默认值在 config/initializers/session_store.rb 中设置。
  • cookies.secure 允许你使用 cookie.secure[:key] => value 在 cookie 中设置加密值。
  • cookies.permanent 允许你在 cookie 哈希 cookie.permanent[:key] => value 中设置永久值,如果验证失败,则对签名值抛出异常。
  • 你现在可以将 :notice => 'This is a flash message':alert => 'Something went wrong' 传递给 respond_to 块内的 format 调用。flash[] 哈希仍然像以前一样工作。
  • respond_with 方法现已添加到你的控制器中,简化了古老的 format 块。
  • 添加了 ActionController::Responder,让你在生成响应时拥有灵活性。

弃用

  • filter_parameter_logging 已弃用,取而代之的是 config.filter_parameters << :password

更多信息

7.3. Action Dispatch

Action Dispatch 是 Rails 3.0 中新增的,它为路由提供了一个新的、更简洁的实现。

  • 路由器进行了大幅清理和重写,Rails 路由器现在是 rack_mount,顶部有一个 Rails DSL,它是一个独立的软件。
  • 每个应用程序定义的路由现在都在你的 Application 模块内命名空间,即

    # Instead of:
    
    ActionController::Routing::Routes.draw do |map|
      map.resources :posts
    end
    
    # You do:
    
    AppName::Application.routes do
      resources :posts
    end
    
  • 向路由器添加了 match 方法,你也可以将任何 Rack 应用程序传递给匹配的路由。

  • 向路由器添加了 constraints 方法,允许你使用定义的约束来保护路由器。

  • 向路由器添加了 scope 方法,允许你为不同的语言或不同的操作命名空间路由,例如

    scope 'es' do
      resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto'
    end
    
    # Gives you the edit action with /es/proyecto/1/cambiar
    
  • 向路由器添加了 root 方法,作为 match '/', :to => path 的快捷方式。

  • 你可以在匹配中传递可选段,例如 match "/:controller(/:action(/:id))(.:format)",每个括号内的段都是可选的。

  • 路由可以通过块表示,例如你可以调用 controller :home { match '/:action' }

旧式 map 命令仍然像以前一样工作,并带有向后兼容层,但是这将在 3.1 版本中移除。

弃用

  • 非 REST 应用程序的包罗万象的路由 (/:controller/:action/:id) 现在已被注释掉。
  • 路由 :path_prefix 不再存在,:name_prefix 现在会自动在给定值的末尾添加“_”。

更多信息: * Rails 3 路由器:打包 * Rails 3 中改进的路由 * Rails 3 中的通用操作

7.4. Action View

7.4.1. 非侵入式 JavaScript

Action View 助手进行了重大重写,实现了非侵入式 JavaScript (UJS) 钩子并移除了旧的内联 AJAX 命令。这使得 Rails 可以使用任何兼容的 UJS 驱动程序来实现助手中的 UJS 钩子。

这意味着所有以前的 remote_<method> 助手已从 Rails 核心中移除并放入 Prototype Legacy Helper。要将 UJS 钩子添加到你的 HTML 中,你现在需要传递 :remote => true。例如

form_for @post, :remote => true

产生

<form action="http://host.com" id="create-post" method="post" data-remote="true">

7.4.2. 带块的助手

form_fordiv_for 这样从块插入内容的助手现在使用 <%=

<%= form_for @post do |f| %>
  ...
<% end %>

你自己的这类助手应返回一个字符串,而不是手动附加到输出缓冲区。

做其他事情的助手,如 cachecontent_for,不受此更改的影响,它们像以前一样需要 &lt;%

7.4.3. 其他变更

  • 你不再需要调用 h(string) 来转义 HTML 输出,它在所有视图模板中默认开启。如果你想要未转义的字符串,请调用 raw(string)
  • 助手现在默认输出 HTML5。
  • 表单标签助手现在以单个值从 I18n 中拉取值,因此 f.label :name 将拉取 :name 翻译。
  • I18n 选择标签现在应该是 :en.helpers.select 而不是 :en.support.select。
  • 你不再需要在 ERB 模板内的 Ruby 插值末尾放置减号,以移除 HTML 输出中尾随的回车符。
  • 向 Action View 添加了 grouped_collection_select 助手。
  • 添加了 content_for?,允许你在渲染之前检查视图中是否存在内容。
  • :value => nil 传递给表单助手会将字段的 value 属性设置为 nil,而不是使用默认值
  • :id => nil 传递给表单助手将导致这些字段在渲染时不带 id 属性
  • :alt => nil 传递给 image_tag 将导致 img 标签在渲染时不带 alt 属性

8. Active Model

Active Model 是 Rails 3.0 中的新功能。它为任何 ORM 库提供了一个抽象层,通过实现 Active Model 接口来与 Rails 交互。

8.1. ORM 抽象和 Action Pack 接口

解耦核心组件的一部分是从 Action Pack 中提取所有与 Active Record 的联系。现在这已经完成。所有新的 ORM 插件现在只需实现 Active Model 接口即可与 Action Pack 无缝协作。

更多信息: - 让任何 Ruby 对象感觉像 ActiveRecord

8.2. 验证

验证已从 Active Record 移至 Active Model,提供了一个验证接口,可在 Rails 3 中跨 ORM 库工作。

  • 现在有一个 validates :attribute, options_hash 快捷方法,允许你为所有 validates 类方法传递选项,你可以向 validate 方法传递多个选项。
  • validates 方法有以下选项
    • :acceptance => Boolean.
    • :confirmation => Boolean.
    • :exclusion => { :in => Enumerable }.
    • :inclusion => { :in => Enumerable }.
    • :format => { :with => Regexp, :on => :create }.
    • :length => { :maximum => Fixnum }.
    • :numericality => Boolean.
    • :presence => Boolean.
    • :uniqueness => Boolean.

所有 Rails 2.3 风格的验证方法在 Rails 3.0 中仍然受支持,新的 validates 方法旨在作为模型验证的额外辅助,而不是现有 API 的替代品。

你还可以传入一个验证器对象,然后可以在使用 Active Model 的对象之间重用它

class TitleValidator < ActiveModel::EachValidator
  Titles = ['Mr.', 'Mrs.', 'Dr.']
  def validate_each(record, attribute, value)
    unless Titles.include?(value)
      record.errors[attribute] << 'must be a valid title'
    end
  end
end
class Person
  include ActiveModel::Validations
  attr_accessor :title
  validates :title, :presence => true, :title => true
end

# Or for Active Record

class Person < ActiveRecord::Base
  validates :title, :presence => true, :title => true
end

还支持内省

User.validators
User.validators_on(:login)

更多信息

9. Active Record

Active Record 在 Rails 3.0 中受到了大量关注,包括抽象到 Active Model、使用 Arel 全面更新查询接口、验证更新以及许多增强和修复。所有 Rails 2.x API 都将通过兼容层可用,该层将支持到 3.1 版本,直到 3.2 版本才移除。

9.1. 查询接口

Active Record 通过使用 Arel,现在在其核心方法上返回关系。Rails 2.3.x 中现有的 API 仍然受支持,并且直到 Rails 3.1 才被弃用,直到 Rails 3.2 才被移除,但是,新的 API 提供了以下新方法,它们都返回关系,允许它们链接在一起

  • where - 提供关系的条件,返回什么。
  • select - 选择你希望从数据库返回的模型属性。
  • group - 根据提供的属性对关系进行分组。
  • having - 提供限制组关系的表达式 (GROUP BY 约束)。
  • joins - 将关系连接到另一个表。
  • clause - 提供限制连接关系的表达式 (JOIN 约束)。
  • includes - 包含预加载的其他关系。
  • order - 根据提供的表达式对关系进行排序。
  • limit - 将关系限制为指定数量的记录。
  • lock - 锁定从表中返回的记录。
  • readonly - 返回数据的只读副本。
  • from - 提供从多个表中选择关系的方法。
  • scope - (以前是 named_scope) 返回关系,并可以与其他关系方法链接在一起。
  • with_scope - 和 with_exclusive_scope 现在也返回关系,因此可以链接。
  • default_scope - 也适用于关系。

更多信息

9.2. 增强功能

  • 向 Active Record 对象添加了 :destroyed?
  • 向 Active Record 关联添加了 :inverse_of,允许你拉取已加载关联的实例,而无需访问数据库。

9.3. 补丁和弃用

此外,Active Record 分支中还有许多修复

  • SQLite 2 支持已放弃,转而支持 SQLite 3。
  • MySQL 支持列顺序。
  • PostgreSQL 适配器的时间区域支持已修复,因此不再插入不正确的值。
  • PostgreSQL 表名支持多个模式。
  • PostgreSQL 支持 XML 数据类型列。
  • table_name 现在已缓存。
  • Oracle 适配器也进行了大量工作,并修复了许多错误。

以及以下弃用

  • Active Record 类中的 named_scope 已弃用,并已重命名为 scope
  • scope 方法中,你应该转向使用关系方法,而不是 :conditions => {} 查找方法,例如 scope :since, lambda {|time| where("created_at > ?", time) }
  • save(false) 已弃用,取而代之的是 save(:validate => false)
  • Active Record 的 I18n 错误消息应从 :en.activerecord.errors.template 更改为 :en.errors.template
  • model.errors.on 已弃用,取而代之的是 model.errors[]
  • validates_presence_of => validates... :presence => true
  • ActiveRecord::Base.colorize_loggingconfig.active_record.colorize_logging 已弃用,取而代之的是 Rails::LogSubscriber.colorize_loggingconfig.colorize_logging

尽管 State Machine 的实现在 Active Record edge 中已存在数月,但它已从 Rails 3.0 版本中移除。

10. Active Resource

Active Resource 也被提取到 Active Model 中,允许你将 Active Resource 对象与 Action Pack 无缝使用。

  • 通过 Active Model 添加了验证。
  • 添加了观察钩子。
  • HTTP 代理支持。
  • 添加了对摘要认证的支持。
  • 将模型命名移至 Active Model。
  • 将 Active Resource 属性更改为具有不敏感访问权限的 Hash。
  • 为等效的 find scope 添加了 firstlastall 别名。
  • 如果未返回任何内容,find_every 现在不会返回 ResourceNotFound 错误。
  • 添加了 save!,除非对象 valid?,否则会引发 ResourceInvalid
  • update_attributeupdate_attributes 添加到 Active Resource 模型。
  • 添加了 exists?
  • SchemaDefinition 重命名为 Schema,将 define_schema 重命名为 schema
  • 使用 Active Resources 的 format 而不是远程错误的 content-type 来加载错误。
  • 对 schema 块使用 instance_eval
  • 修复 ActiveResource::ConnectionError#to_s@response 不响应 #code 或 #message 时的问题,处理 Ruby 1.9 兼容性。
  • 添加对 JSON 格式错误的兼容。
  • 确保 load 适用于数字数组。
  • 将远程资源的 410 响应识别为资源已被删除。
  • 添加在 Active Resource 连接上设置 SSL 选项的功能。
  • 设置连接超时也会影响 Net::HTTP open_timeout

弃用

  • save(false) 已弃用,取而代之的是 save(:validate => false)
  • Ruby 1.9.2: URI.parse.decode 已弃用,不再在库中使用。

11. Active Support

Active Support 投入了大量精力使其可按需选择,也就是说,你不再需要引入整个 Active Support 库来获取其中的部分。这使得 Rails 的各种核心组件能够更精简地运行。

以下是 Active Support 的主要变化

  • 对库进行了大规模清理,移除了所有未使用的方。
  • Active Support 不再提供 TZInfo、Memcache Client 和 Builder 的捆绑版本。这些都作为依赖项包含在内,并通过 bundle install 命令安装。
  • 安全缓冲区在 ActiveSupport::SafeBuffer 中实现。
  • 添加了 Array.uniq_byArray.uniq_by!
  • 移除了 Array#rand 并从 Ruby 1.9 反向移植了 Array#sample
  • 修复了 TimeZone.seconds_to_utc_offset 返回错误值的错误。
  • 添加了 ActiveSupport::Notifications 中间件。
  • ActiveSupport.use_standard_json_time_format 现在默认为 true。
  • ActiveSupport.escape_html_entities_in_json 现在默认为 false。
  • Integer#multiple_of? 接受零作为参数,除非接收器为零,否则返回 false。
  • string.chars 已重命名为 string.mb_chars
  • ActiveSupport::OrderedHash 现在可以通过 YAML 反序列化。
  • 为 XmlMini 添加了基于 SAX 的解析器,使用 LibXML 和 Nokogiri。
  • 添加了 Object#presence,如果对象 #present? 则返回对象,否则返回 nil
  • 添加了 String#exclude? 核心扩展,它返回 #include? 的反向。
  • ActiveSupport 中的 DateTime 添加了 to_i,以便 to_yaml 在具有 DateTime 属性的模型上正确工作。
  • 添加了 Enumerable#exclude? 以使 Enumerable#include? 保持一致并避免 if !x.include?
  • 切换到 Rails 默认开启的 XSS 转义。
  • 支持 ActiveSupport::HashWithIndifferentAccess 中的深度合并。
  • Enumerable#sum 现在适用于所有可枚举对象,即使它们不响应 :size
  • 零长度持续时间的 inspect 返回 '0 seconds' 而不是空字符串。
  • elementcollection 添加到 ModelName
  • String#to_timeString#to_datetime 处理小数秒。
  • 为 around 过滤器对象添加了对新回调的支持,该对象响应在 before 和 after 回调中使用的 :before:after
  • ActiveSupport::OrderedHash#to_a 方法返回有序数组集。与 Ruby 1.9 的 Hash#to_a 匹配。
  • MissingSourceFile 作为常量存在,但它现在只是等于 LoadError
  • 添加了 Class#class_attribute,以便能够声明一个类级别属性,其值可被子类继承和覆盖。
  • 最后移除了 ActiveRecord::Associations 中的 DeprecatedCallbacks
  • Object#metaclass 现在是 Kernel#singleton_class 以匹配 Ruby。

以下方法已被移除,因为它们现在在 Ruby 1.8.7 和 1.9 中可用。

  • Integer#even?Integer#odd?
  • String#each_char
  • String#start_with?String#end_with?(仍保留第三人称别名)
  • String#bytesize
  • Object#tap
  • Symbol#to_proc
  • Object#instance_variable_defined?
  • Enumerable#none?

REXML 的安全补丁仍保留在 Active Support 中,因为 Ruby 1.8.7 的早期补丁级别仍然需要它。Active Support 知道是否需要应用它。

以下方法已被移除,因为它们不再在框架中使用

  • Kernel#daemonize
  • Object#remove_subclasses_of Object#extend_with_included_modules_from, Object#extended_by
  • Class#remove_class
  • Regexp#number_of_captures, Regexp.unoptionalize, Regexp.optionalize, Regexp#number_of_captures

12. Action Mailer

Action Mailer 获得了新的 API,TMail 被新的 Mail 作为电子邮件库取代。Action Mailer 本身也进行了几乎完全重写,几乎每一行代码都经过了修改。结果是 Action Mailer 现在只是继承自 Abstract Controller 并将 Mail gem 包装在 Rails DSL 中。这大大减少了 Action Mailer 中的代码量和其他库的重复。

  • 所有邮件程序现在默认位于 app/mailers
  • 现在可以使用新的 API 通过三个方法发送电子邮件:attachmentsheadersmail
  • Action Mailer 现在通过 attachments.inline 方法原生支持内联附件。
  • Action Mailer 电子邮件方法现在返回 Mail::Message 对象,然后可以向其发送 deliver 消息以发送自身。
  • 所有交付方法现在都被抽象到 Mail gem 中。
  • 邮件交付方法可以接受所有有效邮件头字段及其值对的哈希。
  • mail 交付方法与 Action Controller 的 respond_to 类似,你可以显式或隐式渲染模板。Action Mailer 会根据需要将电子邮件转换为多部分电子邮件。
  • 你可以在 mail 块内将 proc 传递给 format.mime_type 调用,并显式渲染特定类型的文本,或添加布局或不同的模板。proc 内的 render 调用来自 Abstract Controller 并支持相同的选项。
  • 以前的邮件程序单元测试已移至功能测试。
  • Action Mailer 现在将所有邮件头字段和正文的自动编码委托给 Mail Gem
  • Action Mailer 会自动为你编码邮件正文和邮件头

弃用

  • :charset:content_type:mime_version:implicit_parts_order 都已弃用,取而代之的是 ActionMailer.default :key => value 风格的声明。
  • Mailer 动态 create_method_namedeliver_method_name 已弃用,只需调用 method_name,它现在返回一个 Mail::Message 对象。
  • ActionMailer.deliver(message) 已弃用,只需调用 message.deliver
  • template_root 已弃用,在 mail 生成块中,将选项传递给 format.mime_type 方法内的 proc 中的渲染调用
  • 定义实例变量的 body 方法已弃用 (body {:ivar => value}),只需直接在方法中声明实例变量,它们将在视图中可用。
  • Mailer 位于 app/models 已弃用,请改用 app/mailers

更多信息

13. 鸣谢

有关为 Rails 3 付出大量时间的众多贡献者,请参阅Rails 贡献者完整列表。向所有他们致敬。

Rails 3.0 发布说明由 Mikel Lindsaar 编译。



回到顶部