安装 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/rails,rails 命令会检测它是否在 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 方法已移除,并已替换为使用 bundler 和 Gemfile,请参见下面的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。这个 Gemfile 由 Bundler 处理,然后 Bundler 会安装所有依赖项。它甚至可以将所有依赖项本地安装到你的应用程序,这样它就不依赖于系统 gem。
更多信息: - bundler 主页
2.2. 前沿开发
Bundler 和 Gemfile 使冻结 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 的创建使得 ActionController 和 ActionMailer 得以大大简化,通用代码从所有这些库中移除并放入 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::Translation和ActiveModel::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/tasks 和 PLUGIN/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_for 或 div_for 这样从块插入内容的助手现在使用 <%=
<%= form_for @post do |f| %>
...
<% end %>
你自己的这类助手应返回一个字符串,而不是手动附加到输出缓冲区。
做其他事情的助手,如 cache 或 content_for,不受此更改的影响,它们像以前一样需要 <%。
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_logging和config.active_record.colorize_logging已弃用,取而代之的是Rails::LogSubscriber.colorize_logging或config.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 添加了
first、last和all别名。 - 如果未返回任何内容,
find_every现在不会返回ResourceNotFound错误。 - 添加了
save!,除非对象valid?,否则会引发ResourceInvalid。 - 将
update_attribute和update_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::HTTPopen_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_by和Array.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' 而不是空字符串。 - 将
element和collection添加到ModelName。 String#to_time和String#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_charString#start_with?和String#end_with?(仍保留第三人称别名)String#bytesizeObject#tapSymbol#to_procObject#instance_variable_defined?Enumerable#none?
REXML 的安全补丁仍保留在 Active Support 中,因为 Ruby 1.8.7 的早期补丁级别仍然需要它。Active Support 知道是否需要应用它。
以下方法已被移除,因为它们不再在框架中使用
Kernel#daemonizeObject#remove_subclasses_ofObject#extend_with_included_modules_from,Object#extended_byClass#remove_classRegexp#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 通过三个方法发送电子邮件:
attachments、headers和mail。 - 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_name和deliver_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 编译。