安裝 Rails 3:
# 如果你的設置需要,使用 sudo
$ 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崩溃。然而,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 # 替代了script/console
$ rails g scaffold post title:string # 替代了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 is now an Official Plugin中看到它的示例。
除了Rails Upgrade工具之外,如果你需要更多帮助,可以在IRC和rubyonrails-talk上找到正在进行相同操作的人,他们可能遇到相同的问题。确保在升级过程中记录自己的经验,以便其他人可以从你的知识中受益!
2 創建一個Rails 3.0應用程序
# 您應該已經安裝了 'rails' RubyGem
$ 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抽象
解耦核心組件的一部分是從Action Pack中提取所有與Active Record的關聯。這已經完成。所有新的ORM插件現在只需要實現Active Model接口,就可以與Action Pack無縫配合。
更多信息:- Make Any Ruby Object Feel Like ActiveRecord
3.4 控制器抽象
解耦核心組件的另一個重要部分是創建一個與HTTP概念分離的基礎超類,以處理視圖的渲染等。這個AbstractController
的創建使得ActionController
和ActionMailer
可以大大簡化,從所有這些庫中刪除共同代碼並放入Abstract Controller中。
更多資訊:- Rails Edge 架構
3.5 Arel 整合
Arel(或稱為 Active Relation)已成為 Active Record 的基礎並且現在在 Rails 中是必需的。Arel 提供了一個簡化 Active Record 的 SQL 抽象,並為 Active Record 中的關聯功能提供基礎。
更多資訊:- 為什麼我寫了 Arel
3.6 郵件提取
Action Mailer 從一開始就有猴子補丁、預解析器,甚至是傳送和接收代理,除了在源代碼樹中有 TMail。版本 3 改變了這一點,將所有與電子郵件相關的功能抽象到 Mail gem 中。這再次減少了代碼重複,並有助於在 Action Mailer 和郵件解析器之間建立可定義的邊界。
更多資訊:- Rails 3 中的新 Action Mailer API
4 文件
Rails 樹中的文件正在更新以反映所有 API 更改,此外,Rails Edge Guides 正在逐一更新以反映 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合并为同一个API。
生成器不再从特定路径加载,而是在Ruby加载路径中查找,因此调用
rails generate foo
将查找generators/foo_generator
。新的生成器提供了钩子,因此任何模板引擎、ORM、测试框架都可以轻松地进行钩入。
新的生成器允许您通过将副本放置在
Rails.root/lib/templates
中来覆盖模板。还提供了
Rails::Generators::TestCase
,因此您可以创建自己的生成器并对其进行测试。
此外,Railties生成器生成的视图也进行了一些改进:
- 视图现在使用
div
标签而不是p
标签。 - 生成的脚手架现在使用
_form
局部视图,而不是在编辑和新建视图中重复的代码。 - 脚手架表单现在使用
f.submit
,根据传入的对象的状态返回"Create ModelName"或"Update 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 抽象控制器
抽象控制器将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中设置加密值,例如cookie.secure[:key] => value
。cookies.permanent
允许您在cookie哈希中设置永久值,例如cookie.permanent[:key] => value
,如果签名值验证失败,则会引发异常。- 现在可以在
respond_to
块内的format
调用中传递:notice => 'This is a flash message'
或:alert => 'Something went wrong'
。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模塊中進行命名空間分隔,例如:
# 舊寫法: ActionController::Routing::Routes.draw do |map| map.resources :posts end # 新寫法: AppName::Application.routes do resources :posts end
在路由器中添加了
match
方法,你還可以將任何Rack應用程序傳遞給匹配的路由。在路由器中添加了
constraints
方法,允許你使用定義的約束來保護路由器。在路由器中添加了
scope
方法,允許你為不同的語言或不同的操作命名空間路由,例如:scope 'es' do resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto' end # 給你的編輯操作是/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路由器:Rack它起來 * 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 庫使用以與 Rails 交互,通過實現 Active Model 接口。
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
方法有以下選項::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 3.0中,仍然支持所有Rails版本2.3的風格驗證方法,新的validates方法設計為模型驗證的附加輔助,而不是現有API的替代品。
您還可以傳入一個驗證器對象,然後在使用Active Model的對象之間重複使用:
class TitleValidator < ActiveModel::EachValidator
Titles = ['先生', '夫人', '博士']
def validate_each(record, attribute, value)
unless Titles.include?(value)
record.errors[attribute] << '必須是有效的稱號'
end
end
end
class Person
include ActiveModel::Validations
attr_accessor :title
validates :title, :presence => true, :title => true
end
# 或者對於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 adapter 的
TIME ZONE
支援,不再插入錯誤的值。 - 支援 PostgreSQL 表格名稱中的多個 schema。
- 支援 PostgreSQL 的 XML 資料類型欄位。
- 現在會快取
table_name
。 - 在 Oracle adapter 上進行了大量的工作,修正了許多錯誤。
還有以下的廢棄功能:
- 在 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 中,使你可以無縫地在 Action Pack 中使用 Active Resource 物件。
- 透過 Active Model 新增了驗證功能。
- 新增了觀察鉤子。
- 支援 HTTP 代理。
- 新增了摘要驗證的支援。
- 將模型命名移入 Active Model。
- 將 Active Resource 屬性改為具有無差別存取的 Hash。
- 為等效的查詢範圍新增了
first
、last
和all
的別名。 - 如果沒有返回任何結果,
find_every
現在不會返回ResourceNotFound
錯誤。 - 新增了
save!
,除非物件是valid?
,否則會引發ResourceInvalid
錯誤。 - 在 Active Resource 模型中新增了
update_attribute
和update_attributes
。 - 新增了
exists?
。 - 將
SchemaDefinition
改名為Schema
,並將define_schema
改為schema
。 - 使用 Active Resources 的
format
而不是遠端錯誤的content-type
來載入錯誤。 - 使用
instance_eval
進行 schema 區塊。 - 修正了當
@response
不回應 #code 或 #message 時,ActiveResource::ConnectionError#to_s
的問題,處理 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_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 反序列化。- 使用 LibXML 和 Nokogiri 添加了基於 SAX 的 XmlMini 解析器。
- 添加了
Object#presence
,如果對象是#present?
,則返回該對象,否則返回nil
。 - 添加了
String#exclude?
核心擴展,返回#include?
的相反值。 - 在
ActiveSupport
中為DateTime
添加了to_i
,以便在具有DateTime
屬性的模型上正確使用to_yaml
。 - 添加了
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 回調中使用
: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會根據需要將郵件轉換為多部分郵件。- 可以將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
樣式的聲明。- 郵件動態
create_method_name
和deliver_method_name
已棄用,只需調用method_name
,它現在返回一個Mail::Message
對象。 ActionMailer.deliver(message)
已棄用,只需調用message.deliver
。template_root
已棄用,將選項傳遞給mail
生成塊內部的format.mime_type
方法中的渲染調用。使用
app/models
中的郵件已棄用,改用app/mailers
。 更多資訊:
13 貢獻者
請參閱 Rails 的完整貢獻者名單,感謝所有花費許多時間製作 Rails 3 的人們。
Rails 3.0 發行說明由 Mikel Lindsaar 編輯。
回饋
歡迎協助提升本指南的品質。
如果您發現任何錯別字或事實錯誤,請貢獻您的力量。 開始之前,您可以閱讀我們的 文件貢獻 部分。
您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。
如果您發現需要修復但無法自行修補的問題,請 開啟一個問題。
最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。