更多信息请访问 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 包含了 250 多位作者的近 4,000 次提交!如果你想看到所有内容,请查看 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 存在序列化错误,会导致 Rails 3.0 崩溃。自 1.8.7-2010.02 版发布以来,Ruby Enterprise Edition 已修复了这些错误。在 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 替换,请参阅下面的 供应商化 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 供应商化 Gems

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

更多信息:- 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,您可以使用该 API 来开发插件。这意味着您制作的任何插件或任何核心组件替换(如 DataMapper 或 Sequel)都可以访问 Rails 核心组件可访问的所有功能,并可以根据需要进行扩展和增强。

更多信息:- The Great Decoupling

3.3 Active Model 抽象

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

更多信息:- Make Any Ruby Object Feel Like ActiveRecord

3.4 控制器抽象

核心组件解耦的另一个重要部分是创建一个基础超类,该超类与 HTTP 的概念分离,以便处理视图的渲染等。AbstractController 的创建允许 ActionControllerActionMailer 通过从所有这些库中删除公共代码并将其放入 Abstract Controller 来大大简化。

更多信息:- Rails Edge Architecture

3.5 Arel 集成

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

更多信息:- Why I wrote Arel

3.6 邮件提取

Action Mailer 自诞生以来一直拥有猴子补丁、预解析器甚至传递和接收代理,此外还将 TMail 放在源代码树中。版本 3 改变了这种状况,将所有与电子邮件消息相关的功能抽象到 Mail gem 中。这再次减少了代码重复,并有助于在 Action Mailer 和电子邮件解析器之间创建可定义的边界。

更多信息:- New Action Mailer API in Rails 3

4 文档

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

更多信息:- Rails Documentation Projects

5 国际化

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

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

更多信息:- Rails 3 I18n changes

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 标志,该标志将使用指向您的 Rails 签出(由 rails 二进制文件的路径确定)的 Gemfile 设置应用程序。有关更多信息,请参见 rails --help

Railties 生成器在 Rails 3.0 中得到了极大的关注,基本上

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

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

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

最后,向 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 Abstract Controller

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

它还提供了一个清理 Action Controller 的机会,将可以抽象出来的内容抽象出来,以简化代码。

但是请注意,Abstract Controller 不是面向用户的 API,您在日常使用 Rails 时不会遇到它。

更多信息:- Rails Edge Architecture

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_storeActionController::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 现在会在给定值的末尾自动添加“_”。

更多信息:* The Rails 3 Router: Rack it Up * Revamped Routes in Rails 3 * Generic Actions in 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 接口

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

更多信息:- Make Any Ruby Object Feel Like ActiveRecord

8.2 验证

验证已从 Active Record 移动到 Active Model,为 Rails 3 中的各种 ORM 库提供了一个验证接口。

  • 现在有一个validates :attribute, options_hash快捷方法,允许你为所有验证类方法传递选项,你可以将多个选项传递给一个验证方法。
  • validates方法具有以下选项:
    • :acceptance => 布尔值.
    • :confirmation => 布尔值.
    • :exclusion => { :in => 可枚举对象 }.
    • :inclusion => { :in => 可枚举对象 }.
    • :format => { :with => 正则表达式, :on => :create }.
    • :length => { :maximum => 整数 }.
    • :numericality => 布尔值.
    • :presence => 布尔值.
    • :uniqueness => 布尔值.

所有 Rails 版本 2.3 风格的验证方法在 Rails 3.0 中仍然受支持,新的验证方法被设计为模型验证的补充工具,而不是现有 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。

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 适配器已修复其TIME ZONE支持,因此它不再插入不正确的值。
  • 支持 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

虽然状态机实现已经存在于 Active Record 的边缘版本中几个月了,但它已从 Rails 3.0 版本中删除。

10 Active Resource

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

  • 通过 Active Model 添加了验证。
  • 添加了观察挂钩。
  • HTTP 代理支持。
  • 添加了对摘要身份验证的支持。
  • 将模型命名移到 Active Model。
  • 将 Active Resource 属性更改为具有无差别访问的哈希表。
  • 添加了firstlastall别名,用于等效的查找范围。
  • find_every现在如果什么也没返回,不会返回ResourceNotFound错误。
  • 添加了save!,它会在对象valid?之前引发ResourceInvalid
  • 在 Active Resource 模型中添加了update_attributeupdate_attributes
  • 添加了exists?
  • SchemaDefinition重命名为Schema,将define_schema重命名为schema
  • 使用 Active Resource 的format而不是远程错误的content-type来加载错误。
  • 对模式块使用instance_eval
  • 修复了ActiveResource::ConnectionError#to_s@response不响应#code或#message时的问题,处理 Ruby 1.9 兼容性。
  • 添加了对 JSON 格式错误的支持。
  • 确保load适用于数字数组。
  • 识别从远程资源返回的 410 响应,表示资源已被删除。
  • 添加了在 Active Resource 连接上设置 SSL 选项的功能。
  • 设置连接超时也会影响Net::HTTPopen_timeout

弃用

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

11 Active Support

Active Support 做了大量的努力使其可 cherry pick,也就是说,你不再需要加载整个 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 反序列化。
  • 添加了基于 SAX 的 XmlMini 解析器,使用 LibXML 和 Nokogiri。
  • 添加了Object#presence,如果对象#present?,则返回该对象,否则返回nil
  • 添加了String#exclude?核心扩展,返回#include?的反义词。
  • ActiveSupport中添加了DateTimeto_i,以便to_yaml在具有DateTime属性的模型上正常工作。
  • 添加了Enumerable#exclude?,以与Enumerable#include?保持一致,并避免使用!x.include?
  • 将 rails 的 XSS 转义切换为默认启用。
  • 支持ActiveSupport::HashWithIndifferentAccess中的深度合并。
  • Enumerable#sum现在适用于所有可枚举对象,即使它们不响应:size
  • 长度为零的持续时间的inspect返回 '0 seconds',而不是空字符串。
  • ModelName中添加了elementcollection
  • String#to_timeString#to_datetime处理小数秒。
  • 添加了对用于前后回调的响应:before:after的 around 过滤器对象的新的回调的支持。
  • 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,并使用 Rails DSL 包装了 Mail gem。这大大减少了 Action Mailer 中的代码量和对其他库的重复使用。

  • 默认情况下,所有邮件器现在都位于app/mailers中。
  • 现在可以使用新的 API 通过三种方法发送电子邮件:attachmentsheadersmail
  • Action Mailer 现在通过attachments.inline方法原生支持内联附件。
  • Action Mailer 的发送邮件方法现在返回Mail::Message对象,然后可以向其发送deliver消息以自行发送。
  • 所有发送方式现在都已抽象到 Mail gem 中。
  • 发送邮件方法可以接受一个哈希表,其中包含所有有效的邮件头字段及其值对。
  • mail发送方式的行为类似于 Action Controller 的respond_to,你可以显式或隐式地渲染模板。Action Mailer 会根据需要将邮件转换为多部分邮件。
  • 您可以在邮件块内的 format.mime_type 调用中传递一个 proc,并明确地渲染特定类型的文本,或者添加布局或不同的模板。 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 内的 render 调用。
  • 用于定义实例变量的 body 方法 (body {:ivar => value}) 已弃用,只需直接在方法中声明实例变量,它们将在视图中可用。
  • Mailer 位于 app/models 中已弃用,请改用 app/mailers

更多信息

13 版权

查看 Rails 贡献者完整列表,了解为 Rails 3 付出大量时间的人们。感谢他们所有人的努力。

Rails 3.0 发行说明由 Mikel Lindsaar 编写。



返回顶部