安装 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/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
替换,请参阅下面的 供应商化 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。此 Gemfile
由 Bundler 处理,然后安装所有依赖项。它甚至可以将所有依赖项安装到你的应用程序本地,使其不依赖于系统 gems。
更多信息:- 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,您可以使用该 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
的创建允许 ActionController
和 ActionMailer
通过从所有这些库中删除公共代码并将其放入 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::Translation
和ActiveModel::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/tasks
和 PLUGIN/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_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
现在会在给定值的末尾自动添加“_”。
更多信息:* 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_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 接口
核心组件解耦的一部分是将所有与 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_logging
和config.active_record.colorize_logging
已弃用,转而使用Rails::LogSubscriber.colorize_logging
或config.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 属性更改为具有无差别访问的哈希表。
- 添加了
first
、last
和all
别名,用于等效的查找范围。 find_every
现在如果什么也没返回,不会返回ResourceNotFound
错误。- 添加了
save!
,它会在对象valid?
之前引发ResourceInvalid
。 - 在 Active Resource 模型中添加了
update_attribute
和update_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::HTTP
的open_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_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 反序列化。- 添加了基于 SAX 的 XmlMini 解析器,使用 LibXML 和 Nokogiri。
- 添加了
Object#presence
,如果对象#present?
,则返回该对象,否则返回nil
。 - 添加了
String#exclude?
核心扩展,返回#include?
的反义词。 - 在
ActiveSupport
中添加了DateTime
的to_i
,以便to_yaml
在具有DateTime
属性的模型上正常工作。 - 添加了
Enumerable#exclude?
,以与Enumerable#include?
保持一致,并避免使用!x.include?
。 - 将 rails 的 XSS 转义切换为默认启用。
- 支持
ActiveSupport::HashWithIndifferentAccess
中的深度合并。 Enumerable#sum
现在适用于所有可枚举对象,即使它们不响应:size
。- 长度为零的持续时间的
inspect
返回 '0 seconds',而不是空字符串。 - 在
ModelName
中添加了element
和collection
。 String#to_time
和String#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 通过三种方法发送电子邮件:
attachments
、headers
和mail
。 - 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_name
和deliver_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 编写。