1 應用架構
Rails 應用程式的架構有兩個主要變化:Rack 模組化 Web 伺服器介面的完全整合,以及對 Rails 引擎的更新支援。
1.1 Rake 整合
Rails 現在已經打破了過去的 CGI,並且到處都在使用 Rack。這需要並導致了大量的內部更改(但如果您使用 CGI,請不要擔心;Rails 現在通過代理介面支援 CGI。)不過,這是對 Rails 內部的重大更改。升級到 2.3 後,您應該在本地環境和生產環境中進行測試。一些要測試的東西:
- 會話
- 餅乾
- 檔案上傳
- JSON/XML API
以下是與 Rake 相關的更改的摘要:
-
script/server
已經切換為使用 Rack,這意味著它支援任何 Rack 相容的伺服器。script/server
也會選擇一個rackup 配置檔案(如果存在的話)。預設情況下,它會尋找一個config.ru
檔案,但你可以使用-c
開關覆蓋它。 - FCGI 處理程式通過 Rack。
-
ActionController::Dispatcher
維護自己的預設中介軟體堆疊。中介軟體可以被注入、重新排序和刪除。堆疊在啟動時被編譯成一個鏈。您可以在“environment.rb”中配置中介軟體堆疊。 - 添加了
rake middleware
任務來檢查中介軟體堆疊。這對於除錯中介軟體堆疊的順序很有用。 - 整合測試執行器已被修改為執行整個中介軟體和應用程式堆疊。這使得整合測試非常適合測試 Rack 中介軟體。
-
ActionController::CGIHandler
是一個向後相容 Rack 的 CGI 包裝器。CGIHandler
旨在採用舊的 CGI 物件並將其環境資訊轉換為 Rack 相容的形式。 -
CgiRequest
和CgiResponse
已被刪除。 - 會話儲存現在是延遲載入的。如果您在請求期間從不訪問會話物件,它將永遠不會嘗試載入會話資料(解析 cookie、從記憶體快取載入資料或查詢 Active Record 物件)。
- 您不再需要在測試中使用
CGI::Cookie.new
來設定 cookie 值。將String
值分配給 request.cookies["foo"] 現在可以按預期設定 cookie。 -
CGI::Session::CookieStore
已被替換為ActionController::Session::CookieStore
。 -
CGI::Session::MemCacheStore
已被替換為ActionController::Session::MemCacheStore
。 -
CGI::Session::ActiveRecordStore
已被替換為ActiveRecord::SessionStore
。 - 您仍然可以使用
ActionController::Base.session_store = :active_record_store
更改會話儲存。 - 預設會話選項仍然使用
ActionController::Base.session = { :key => "..." }
設定。但是,:session_domain
選項已重新命名為:domain
。 - 通常包裝整個請求的互斥鎖已移入中介軟體
ActionController::Lock
。 -
ActionController::AbstractRequest
和ActionController::Request
已經統一。新的ActionController::Request
繼承自Rack::Request
。這會影響在測試請求中訪問response.headers['type']
。改用response.content_type
。 - 如果載入了
ActiveRecord
,ActiveRecord::QueryCache
中介軟體會自動插入到中介軟體堆疊中。這個中介軟體設定並重新整理每個請求的 Active Record 查詢快取。 - Rails 路由器和控制器類遵循 Rack 規範。您可以使用
SomeController.call(env)
直接呼叫控制器。路由器將路由引數儲存在rack.routing_args
中。 -
ActionController::Request
繼承自Rack::Request
。 - 代替
config.action_controller.session = { :session_key => 'foo', ...
使用config.action_controller.session = { :key => 'foo', ...
。 - 使用
ParamsParser
中介軟體預處理任何XML、JSON 或YAML 請求,以便它們可以在任何Rack::Request
物件之後正常讀取。
1.2 重新支援 Rails 引擎
在一些沒有升級的版本之後,Rails 2.3 為 Rails Engines(可以嵌入其他應用程式的 Rails 應用程式)提供了一些新功能。首先,引擎中的路由檔案現在會自動載入和重新載入,就像你的 routes.rb
檔案一樣(這也適用於其他外掛中的路由檔案)。其次,如果您的外掛有一個 app 資料夾,那麼 app/[models|controllers|helpers] 將自動新增到 Rails 載入路徑中。引擎現在還支援新增檢視路徑,Action Mailer 和 Action View 將使用來自引擎和其他外掛的檢視。
2 文件
Ruby on Rails 指南 專案已經為 Rails 2.3 釋出了幾個額外的指南。此外,單獨的站點 維護 Edge Rails 指南的更新副本。其他文件工作包括重新啟動 Rails wiki 和早期規劃 Rails Book。
- 更多資訊:Rails 文件專案
3 紅寶石 1.9.1 支援
無論您是在 Ruby 1.8 還是現在釋出的 Ruby 1.9.1 上執行,Rails 2.3 都應該通過它自己的所有測試。不過,您應該知道,遷移到 1.9.1 需要檢查所有資料介面卡、外掛和您依賴的其他程式碼以確保 Ruby 1.9.1 相容性以及 Rails 核心。
4 活動記錄
Active Record 在 Rails 2.3 中獲得了相當多的新功能和錯誤修復。亮點包括巢狀屬性、巢狀事務、動態和預設範圍以及批處理。
4.1 巢狀屬性
Active Record 現在可以直接更新巢狀模型的屬性,前提是您告訴它這樣做:
class Book < ActiveRecord::Base
has_one :author
has_many :pages
accepts_nested_attributes_for :author, :pages
end
啟用巢狀屬性可以實現許多功能:自動(和原子)儲存記錄及其關聯的子項、子項感知驗證以及對巢狀表單的支援(稍後討論)。
您還可以使用 :reject_if
選項為通過巢狀屬性新增的任何新記錄指定要求:
accepts_nested_attributes_for :author,
:reject_if => proc { |attributes| attributes['name'].blank? }
- 主要貢獻者:Eloy Duran
- 更多資訊:巢狀模型表單
4.2 巢狀事務
Active Record 現在支援巢狀事務,這是一項非常受歡迎的功能。現在你可以寫這樣的程式碼:
User.transaction do
User.create(:username => 'Admin')
User.transaction(:requires_new => true) do
User.create(:username => 'Regular')
raise ActiveRecord::Rollback
end
end
User.find(:all) # => Returns only Admin
巢狀事務讓您回滾內部事務而不影響外部事務的狀態。如果要巢狀事務,則必須顯式新增:requires_new
選項;否則,巢狀事務只會成為父事務的一部分(就像當前在 Rails 2.2 上所做的那樣)。在幕後,巢狀事務 使用儲存點 因此即使在沒有真正巢狀事務的資料庫上也支援它們。在測試期間,還有一些魔法可以使這些事務與事務性裝置很好地配合。
- 主要貢獻者:Jonathan Viney 和 Hongli Lai
4.3 動態範圍
您瞭解 Rails 中的動態查詢器(它允許您即時編造諸如“find_by_color_and_flavor”之類的方法)和命名範圍(允許您將可重用的查詢條件封裝為“currently_active”之類的友好名稱)。好吧,現在您可以擁有動態範圍方法。這個想法是將允許動態過濾和方法鏈的語法放在一起。例如:
Order.scoped_by_customer_id(12)
Order.scoped_by_customer_id(12).find(:all,
:conditions => "status = 'open'")
Order.scoped_by_customer_id(12).scoped_by_status("open")
沒有什麼可以定義使用動態範圍:它們只是工作。
- 主要貢獻者:Yaroslav Markin
- 更多資訊:[Edge Rails 的新特性:動態範圍方法](http://archives.ryandaigle.com/articles/2008/12/29/what-s-new-in-edge-rails-dynamic-scope-方法)
4.4 預設範圍
Rails 2.3 將引入 default scopes 的概念,類似於命名範圍,但適用於模型中的所有命名範圍或 find 方法。例如,您可以編寫 default_scope :order => 'name ASC'
並且任何時候您從該模型中檢索記錄時,它們都會按名稱排序(當然,除非您覆蓋該選項)。
- 主要貢獻者:Paweł Kondzior
- 更多資訊:Edge Rails 的新增功能:預設範圍
### 批量處理
您現在可以使用 find_in_batches 處理來自 Active Record 模型的大量記錄,而記憶體壓力更小:
Customer.find_in_batches(:conditions => {:active => true}) do |customer_group|
customer_group.each { |customer| customer.update_account_balance! }
end
您可以將大部分 find
選項傳遞給 find_in_batches
。但是,您不能指定記錄返回的順序(它們總是按主鍵的升序返回,必須是整數),或使用:limit
選項。相反,使用預設為 1000 的 :batch_size
選項來設定將在每個批次中返回的記錄數。
新的 find_each
方法提供了一個圍繞 find_in_batches
的包裝器,它返回單個記錄,查詢本身是分批完成的(預設為 1000):
Customer.find_each do |customer|
customer.update_account_balance!
end
請注意,您應該只將此方法用於批處理:對於少量記錄(小於 1000),您應該只使用帶有自己的迴圈的正常 find 方法。
- 更多資訊(當時方便的方法被稱為
each
):
4.5 回呼的多個條件
使用 Active Record 回呼時,您現在可以在同一個回呼中組合 :if
和 :unless
選項,並以陣列的形式提供多個條件:
before_save :update_credit_rating, :if => :active,
:unless => [:admin, :cash_only]
- 主要貢獻者:L. Caviola
4.6 找到有
Rails 現在在 find 上有一個 :have
選項(以及 has_many
和 has_and_belongs_to_many
關聯),用於過濾分組查詢中的記錄。正如那些具有大量 SQL 背景的人所知,這允許基於分組結果進行過濾:
developers = Developer.find(:all, :group => "salary",
:having => "sum(salary) > 10000", :select => "salary")
- 主要貢獻者:Emilio Tagua
4.7 重新連線 MySQL 連線
MySQL 在其連線中支援重新連線標誌 - 如果設定為 true,則客戶端將嘗試重新連線到伺服器,然後在連線丟失的情況下放棄。您現在可以在“database.yml”中為您的 MySQL 連線設定“reconnect = true”,以從 Rails 應用程式中獲取此行為。預設值為 false
,因此現有應用程式的行為不會改變。
- 主要貢獻者:Dov Murik
- 更多資訊:
4.8 其他活動記錄更改
- 從為
has_and_belongs_to_many
預載入生成的SQL 中刪除了一個額外的AS
,使其更適合某些資料庫。 -
ActiveRecord::Base#new_record?
現在在遇到現有記錄時返回false
而不是nil
。 - 修復了在某些
has_many :through
關聯中引用表名的錯誤。 - 您現在可以為
updated_at
時間戳指定一個特定的時間戳:cust = Customer.create(:name => "ABC Industries", :updated_at => 1.day.ago)
- 更好的關於失敗的
find_by_attribute!
呼叫的錯誤訊息。 - Active Record 的
to_xml
支援通過新增:camelize
選項變得更加靈活。 - 修復了從
before_update
或before_create
中取消回呼的錯誤。 - 添加了通過 JDBC 測試資料庫的 Rake 任務。
-
validates_length_of
將使用帶有:in
或:within
選項(如果提供)的自定義錯誤訊息。 - 對作用域選擇的計數現在可以正常工作,因此您可以執行諸如
Account.scoped(:select => "DISTINCT credit_limit").count
之類的操作。 -
ActiveRecord::Base#invalid?
現在與ActiveRecord::Base#valid?
相反。
5 動作控制器
在此版本中,Action Controller 對渲染進行了一些重大更改,並在路由和其他方面進行了改進。
5.1 統一渲染
ActionController::Base#render
在決定渲染什麼方面要聰明得多。現在你可以告訴它要渲染什麼並期望得到正確的結果。在舊版本的 Rails 中,你經常需要提供顯式資訊來渲染:
render :file => '/tmp/random_file.erb'
render :template => 'other_controller/action'
render :action => 'show'
現在在 Rails 2.3 中,你可以只提供你想要渲染的內容:
render '/tmp/random_file.erb'
render 'other_controller/action'
render 'show'
render :show
Rails 根據要呈現的內容中是否有前導斜槓、嵌入斜槓或根本沒有斜槓,在檔案、模板和操作之間進行選擇。請注意,您還可以在呈現動作時使用符號而不是字串。其他渲染樣式(:inline
、:text
、:update
、:nothing
、:json
、:xml
、:js
)仍然需要顯式選項。
5.2 應用程式控制器重新命名
如果您是一直被application.rb
的特殊命名所困擾的人之一,那麼慶幸吧!它在 Rails 2.3 中被改寫為“application_controller.rb”。此外,還有一個新的 rake 任務,rake rails:update:application_controller
會自動為你執行此操作 - 它將作為正常 rake rails:update
程序的一部分執行。
- 更多資訊:
- 應用之死.rb
- [Edge Rails 的新功能:Application.rb 不再是二元性](http://archives.ryandaigle.com/articles/2008/11/19/what-s-new-in-edge-rails-application-rb -二元性不再存在)
5.3 HTTP 摘要身份驗證支援
Rails 現在內建了對 HTTP 摘要身份驗證的支援。要使用它,您可以使用返回使用者密碼的塊呼叫 authenticate_or_request_with_http_digest
(然後將其雜湊並與傳輸的憑據進行比較):
class PostsController < ApplicationController
Users = {"dhh" => "secret"}
before_filter :authenticate
def secret
render :text => "Password Required!"
end
private
def authenticate
realm = "Application"
authenticate_or_request_with_http_digest(realm) do |name|
Users[name]
end
end
end
- 主要貢獻者:Gregg Kellogg
- 更多資訊:[Edge Rails 的新特性:HTTP 摘要認證](http://archives.ryandaigle.com/articles/2009/1/30/what-s-new-in-edge-rails-http-digest-驗證)
5.4 更高效的路由
Rails 2.3 中有幾個重要的路由更改。 formatted_
路由助手已經消失,只支援傳入 :format
作為選項。這將任何資源的路由生成過程減少了 50% - 並且可以節省大量記憶體(在大型應用程式上高達 100MB)。如果您的程式碼使用 formatted_
幫助程式,它暫時仍然可以工作 - 但這種行為已被棄用,如果您使用新標準重寫這些路由,您的應用程式將更加高效。另一個重大變化是 Rails 現在支援多個路由檔案,而不僅僅是 routes.rb
。您可以隨時使用 RouteSet#add_configuration_file
引入更多路由 - 無需清除當前載入的路由。雖然此更改對引擎最有用,但您可以在需要批量載入路由的任何應用程式中使用它。
- 主要貢獻者:Aaron Batalion
5.5 基於 Rake 的延遲載入會話
一項重大變化將 Action Controller 會話儲存的基礎推到了 Rack 級別。這涉及程式碼中的大量工作,儘管它應該對您的 Rails 應用程式完全透明(作為獎勵,圍繞舊 CGI 會話處理程式的一些令人討厭的補丁已被刪除)。不過,這仍然很重要,原因很簡單:非 Rails Rack 應用程式可以訪問與 Rails 應用程式相同的會話儲存處理程式(因此也是相同的會話)。此外,會話現在是延遲載入的(與框架其餘部分的載入改進一致)。這意味著如果您不想要會話,您不再需要明確禁用它們;只是不要引用它們,它們不會載入。
5.6 MIME 型別處理更改
在 Rails 中處理 MIME 型別的程式碼有一些更改。首先,MIME::Type
現在實現了 =~
運算子,當您需要檢查是否存在具有同義詞的型別時,事情變得更加清晰:
if content_type && Mime::JS =~ content_type
# do something cool
end
Mime::JS =~ "text/javascript" => true
Mime::JS =~ "application/javascript" => true
另一個變化是框架現在在檢查各個位置的 JavaScript 時使用 Mime::JS
,使其能夠乾淨地處理這些替代方案。
- 主要貢獻者:Seth Fitzsimmons
5.7 優化respond_to
在 Rails-Merb 團隊合併的一些初步成果中,Rails 2.3 包括對 respond_to
方法的一些優化,該方法當然在許多 Rails 應用程式中大量使用,以允許您的控制器根據 MIME 型別對結果進行不同的格式化。傳入的請求。在消除對 method_missing
的呼叫以及一些分析和調整後,我們看到每秒提供的請求數量提高了 8%,使用簡單的 respond_to
在三種格式之間切換。最好的部分?無需更改應用程式程式碼即可利用此加速。
5.8 改進的快取效能
Rails 現在從遠端快取儲存中保留每個請求的本地讀取快取,減少不必要的讀取並提高站點效能。雖然這項工作最初僅限於“MemCacheStore”,但它可用於任何遠端儲存,而不是實現所需的方法。
- 主要貢獻者:Nahum Wild
5.9 本地化檢視
Rails 現在可以提供本地化檢視,具體取決於您設定的語言環境。例如,假設您有一個帶有“show”動作的“Posts”控制器。預設情況下,這將呈現app/views/posts/show.html.erb
。但是如果你設定I18n.locale = :da
,它會渲染app/views/posts/show.da.html.erb
。如果本地化模板不存在,則將使用未修飾的版本。 Rails 還包括I18n#available_locales
和I18n::SimpleBackend#available_locales
,它們返回當前Rails 專案中可用的翻譯陣列。
此外,您可以使用相同的方案來本地化公共目錄中的救援檔案:例如,public/500.da.html
或 public/404.en.html
工作。
5.10 翻譯的部分範圍
對翻譯 API 的更改使在部分中編寫關鍵翻譯變得更容易和更少重複。如果你從 people/index.html.erb
模板中呼叫 translate(".foo")
,你實際上會呼叫 I18n.translate("people.index.foo")
如果你不這樣做在金鑰前面加上一個句點,那麼 API 就沒有範圍了,就像以前一樣。
5.11 其他動作控制器更改
- 對 ETag 處理進行了一些清理:當回應沒有正文或使用
send_file
傳送檔案時,Rails 現在將跳過傳送 ETag 標頭。 - Rails 檢查 IP 欺騙的事實對於使用手機進行大量流量的站點來說可能會令人討厭,因為它們的代理通常不會正確設定。如果這就是你,你現在可以設定
ActionController::Base.ip_spoofing_check = false
來完全禁用檢查。 -
ActionController::Dispatcher
現在實現了它自己的中介軟體堆疊,你可以通過執行rake middleware
看到它。 - Cookie 會話現在具有持久會話識別符號,API 與伺服器端儲存區相容。
- 您現在可以為
send_file
和send_data
的:type
選項使用符號,例如:send_file("fabulous.png", :type => :png)
。 -
map.resources
的:only
和:except
選項不再被巢狀資源繼承。 - 捆綁的 memcached 客戶端已更新至 1.6.4.99 版。
-
expires_in
、stale?
和fresh_when
方法現在接受一個:public
選項,使它們能夠很好地與代理快取一起工作。 -
:requirements
選項現在可以與其他 RESTful 成員路由一起正常工作。 - 淺層路由現在正確尊重新命名空間。
-
polymorphic_url
在處理具有不規則複數名稱的物件方面做得更好。
6 動作檢視
Rails 2.3 中的 Action View 選擇了巢狀模型表單、對 render
的改進、更靈活的日期選擇助手提示以及資產快取的加速等。
6.1 巢狀物件表單
如果父模型接受子物件的巢狀屬性(如 Active Record 部分所述),您可以使用 form_for
和 field_for
建立巢狀表單。這些表單可以任意深度巢狀,允許您在單個檢視上編輯複雜的物件層次結構,而無需過多的程式碼。例如,給定這個模型:
class Customer < ActiveRecord::Base
has_many :orders
accepts_nested_attributes_for :orders, :allow_destroy => true
end
您可以在 Rails 2.3 中編寫此檢視:
<% form_for @customer do |customer_form| %>
<div>
<%= customer_form.label :name, 'Customer Name:' %>
<%= customer_form.text_field :name %>
</div>
<!-- Here we call fields_for on the customer_form builder instance.
The block is called for each member of the orders collection. -->
<% customer_form.fields_for :orders do |order_form| %>
<p>
<div>
<%= order_form.label :number, 'Order Number:' %>
<%= order_form.text_field :number %>
</div>
<!-- The allow_destroy option in the model enables deletion of
child records. -->
<% unless order_form.object.new_record? %>
<div>
<%= order_form.label :_delete, 'Remove:' %>
<%= order_form.check_box :_delete %>
</div>
<% end %>
</p>
<% end %>
<%= customer_form.submit %>
<% end %>
- 主要貢獻者:Eloy Duran
- 更多資訊:
6.2 部分的智慧渲染
多年來,渲染方法變得越來越智慧,現在甚至更智慧。如果你有一個物件或一個集合和一個適當的部分,並且命名匹配,你現在可以只渲染物件並且事情會起作用。例如,在 Rails 2.3 中,這些渲染呼叫將在您的檢視中工作(假設命名合理):
# Equivalent of render :partial => 'articles/_article',
# :object => @article
render @article
# Equivalent of render :partial => 'articles/_article',
# :collection => @articles
render @articles
- 更多資訊:[Edge Rails 的新功能:渲染不再需要高維護](http://archives.ryandaigle.com/articles/2008/11/20/what-s-new-in-edge-rails-render -停止高維護)
6.3 提示日期選擇助手
在 Rails 2.3 中,您可以為各種日期選擇助手(date_select
、time_select
和 datetime_select
)提供自定義提示,就像使用集合選擇助手一樣。您可以為各種元件提供提示字串或單個提示字串的雜湊。您也可以將 :prompt
設定為 true
以使用自定義通用提示:
select_datetime(DateTime.now, :prompt => true)
select_datetime(DateTime.now, :prompt => "Choose date and time")
select_datetime(DateTime.now, :prompt =>
{:day => 'Choose day', :month => 'Choose month',
:year => 'Choose year', :hour => 'Choose hour',
:minute => 'Choose minute'})
- 主要貢獻者:Sam Oliver
6.4 AssetTag 時間戳快取
您可能熟悉 Rails 將時間戳新增到靜態資產路徑作為“快取破壞者”的做法。這有助於確保當您在伺服器上更改影象和樣式表等內容時,不會從使用者的瀏覽器快取中提供這些內容的陳舊副本。您現在可以使用 Action View 的 cache_asset_timestamps
配置選項修改此行為。如果啟用快取,那麼 Rails 將在首次提供資產時計算一次時間戳,並儲存該值。這意味著為靜態資產提供服務的檔案系統呼叫更少(昂貴)——但這也意味著您無法在伺服器執行時修改任何資產,並期望客戶端獲取更改。
6.5 資產主機作為物件
資產主機在邊緣 Rails 中變得更加靈活,能夠將資產主機宣告為回應呼叫的特定物件。這允許您在資產託管中實現您需要的任何複雜邏輯。
6.6 grouped_options_for_select 輔助方法
Action View 已經有一堆幫助器來幫助生成選擇控制元件,但現在還有一個:grouped_options_for_select
。這個接受一個字串陣列或雜湊,並將它們轉換成一串用 optgroup
標籤包裹的 option
標籤。例如:
grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]],
"Cowboy Hat", "Choose a product...")
返回
<option value="">Choose a product...</option>
<optgroup label="Hats">
<option value="Baseball Cap">Baseball Cap</option>
<option selected="selected" value="Cowboy Hat">Cowboy Hat</option>
</optgroup>
6.7 禁用表單選擇助手的選項標籤
表單選擇助手(例如select
和options_for_select
)現在支援:disabled
選項,該選項可以在結果標籤中禁用單個值或一組值:
select(:post, :category, Post::CATEGORIES, :disabled => 'private')
返回
<select name="post[category]">
<option>story</option>
<option>joke</option>
<option>poem</option>
<option disabled="disabled">private</option>
</select>
您還可以使用匿名函式在執行時確定將選擇和/或禁用集合中的哪些選項:
options_from_collection_for_select(@product.sizes, :name, :id, :disabled => lambda{|size| size.out_of_stock?})
6.8 關於模板載入的注意事項
Rails 2.3 包括為任何特定環境啟用或禁用快取模板的能力。快取模板為您提供了速度提升,因為它們在呈現時不會檢查新模板檔案 - 但它們也意味著您無法在不重新啟動伺服器的情況下“即時”替換模板。
在大多數情況下,您需要在生產中開啟模板快取,您可以通過在“production.rb”檔案中進行設定來實現:
config.action_view.cache_template_loading = true
預設情況下,將在新的 Rails 2.3 應用程式中為您生成這一行。如果您從舊版本的 Rails 升級,Rails 將預設在生產和測試中快取模板,而不是在開發中。
6.9 其他操作檢視更改
- 簡化了CSRF保護的令牌生成;現在 Rails 使用由
ActiveSupport::SecureRandom
生成的簡單隨機字串,而不是使用會話 ID。 -
auto_link
現在可以正確地將選項(例如:target
和:class
)應用於生成的電子郵件連結。 -
autolink
助手已經過重構,使其不那麼混亂,更直觀。 -
current_page?
現在即使 URL 中有多個查詢引數也能正常工作。
7 積極支援
Active Support 有一些有趣的變化,包括引入Object#try
。
7.1 物件#嘗試
很多人都採用了使用 try() 來嘗試對物件進行操作的概念。它在檢視中特別有用,您可以通過編寫像 <%= @person.try(:name) %>
這樣的程式碼來避免空檢查。好吧,現在它已經融入到 Rails 中了。正如在 Rails 中實現的那樣,它在私有方法上引發 NoMethodError
,並且如果物件為 nil,則總是返回 nil
。
- 更多資訊:try()
7.2 物件#tap 向後移植
Object#tap
是對 Ruby 1.9 和 1.8.7 的補充,類似於 returning
Rails 有一段時間的方法:它產生一個塊,然後返回產生的物件。 Rails 現在包含程式碼,以便在舊版本的 Ruby 下也可以使用它。
7.3 XMLmini 的可交換解析器
通過允許您交換不同的解析器,Active Support 中對 XML 解析的支援變得更加靈活。預設情況下,它使用標準的 REXML 實現,但您可以輕鬆地為您自己的應用程式指定更快的 LibXML 或 Nokogiri 實現,前提是您安裝了適當的 gem:
XmlMini.backend = 'LibXML'
- 主要貢獻者:Bart 10 Brinke
- 主要貢獻者:Aaron Patterson
7.4 TimeWithZone 的小數秒
Time
和 TimeWithZone
類包含一個 xmlschema
方法,以 XML 友好的字串形式返回時間。從 Rails 2.3 開始,TimeWithZone
支援與Time
相同的引數,用於指定返回字串的小數第二部分中的位數:
Time.zone.now.xmlschema(6) # => "2009-01-16T13:00:06.13653Z"
- 主要貢獻者:Nicholas Dainty
7.5 JSON 鍵引用
如果您在“json.org”站點上查詢規範,您會發現 JSON 結構中的所有鍵都必須是字串,並且它們必須用雙引號引起來。從 Rails 2.3 開始,我們在這裡做了正確的事情,即使是使用數字鍵。
7.6 其他主動支援更改
- 您可以使用
Enumerable#none?
來檢查所有元素是否與提供的塊匹配。 - 如果您使用 Active Support delegates 新的
:allow_nil
選項讓您返回nil
而不是在目標物件為 nil 時引發異常。 -
ActiveSupport::OrderedHash
:現在實現each_key
和each_value
。 -
ActiveSupport::MessageEncryptor
提供了一種簡單的方法來加密資訊以儲存在不受信任的位置(如 cookie)。 - Active Support 的
from_xml
不再依賴於 XmlSimple。相反,Rails 現在包含了它自己的 XmlMini 實現,僅具有它所需的功能。這讓 Rails 免除了它一直在搬運的 XmlSimple 的捆綁副本。 - 如果你記住一個私有方法,結果現在將是私有的。
-
String#parameterize
接受一個可選的分隔符:"Quick Brown Fox".parameterize('_') => "quick_brown_fox"
。 -
number_to_phone
現在接受 7 位電話號碼。 -
ActiveSupport::Json.decode
現在處理\u0000
風格的轉義序列。
8 Rails
除了上面介紹的 Rack 更改之外,Railties(Rails 本身的核心程式碼)還進行了許多重大更改,包括 Rails Metal、應用程式模板和安靜的回溯。
8.1 Rails 金屬
Rails Metal 是一種新機制,可在您的 Rails 應用程式內部提供超快端點。 Metal 類繞過路由和 Action Controller 為您提供原始速度(當然,以 Action Controller 中的所有內容為代價)。這建立在所有最近的基礎工作之上,使 Rails 成為具有公開中介軟體堆疊的 Rack 應用程式。 Metal 端點可以從您的應用程式或外掛載入。
- 更多資訊:
8.2 應用程式模板
Rails 2.3 包含 Jeremy McAnally 的 rg 應用程式生成器。這意味著我們現在在 Rails 中內建了基於模板的應用程式生成;如果您有一組包含在每個應用程式中的外掛(以及許多其他用例),您只需設定一次模板,並在執行 rails
命令時反覆使用它。還有一個 rake 任務可以將模板應用於現有應用程式:
$ rake rails:template LOCATION=~/template.rb
這會將模板中的更改分層到專案已經包含的任何程式碼之上。
- 主要貢獻者:Jeremy McAnally
- 更多資訊:Rails 模板
8.3 更安靜的回溯
基於thoughtbot 的Quiet Backtrace 外掛,它允許您有選擇地從Test::Unit
回溯中刪除行,Rails 2.3 實現了ActiveSupport::BacktraceCleaner
和Rails ::BacktraceCleaner 核心。這支援過濾器(在回溯行上執行基於正則表示式的替換)和消音器(完全刪除回溯行)。 Rails 會自動新增消音器以消除新應用程式中最常見的噪音,並構建一個
config/backtrace_silencers.rb` 檔案來儲存您自己的新增內容。此功能還可以從回溯中的任何 gem 進行更漂亮的列印。
8.4 在開發模式下通過延遲載入/自動載入加快啟動時間
做了大量工作以確保 Rails(及其依賴項)的位只在實際需要時才被帶入記憶體。核心框架——Active Support、Active Record、Action Controller、Action Mailer 和 Action View——現在使用 autoload
來延遲載入它們各自的類。這項工作應該有助於減少記憶體佔用並提高 Rails 的整體效能。
您還可以指定(通過使用新的 preload_frameworks
選項)是否應該在啟動時自動載入核心庫。這預設為 false
,以便 Rails 自動逐個載入自己,但在某些情況下,您仍然需要一次載入所有內容——Passenger 和 JRuby 都希望看到所有 Rails 載入在一起。
8.5 rake gem 任務重寫
各種rake gem
任務的內部結構已經過大幅修改,以使系統在各種情況下都能更好地工作。 gem 系統現在知道開發依賴和執行時依賴之間的差別,有一個更強大的解包系統,在查詢 gem 狀態時提供更好的資訊,並且在你提出問題時不太容易出現“雞和蛋”依賴問題從頭開始。還有一些修復程式用於在 JRuby 下使用 gem 命令以及嘗試引入已經供應商的 gem 的外部副本的依賴項。
- 主要貢獻者:David Dollar
8.6 其他 Railties 更改
- 更新並擴充套件了更新 CI 伺服器以構建 Rails 的說明。
- 內部Rails 測試已經從
Test::Unit::TestCase
切換到ActiveSupport::TestCase
,Rails 核心需要Mocha 來測試。 - 預設的
environment.rb
檔案已被整理。 - dbconsole 指令碼現在允許您使用全數字密碼而不會崩潰。
-
Rails.root
現在返回一個Pathname
物件,這意味著你可以直接使用它和join
方法來清理現有程式碼 使用File.join
。 - 預設情況下,每個 Rails 應用程式中不再生成 /public 中處理 CGI 和 FCGI 排程的各種檔案(如果需要,您仍然可以通過在執行
rails
命令時新增--with-dispatchers
來獲取它們,或者稍後使用rake rails:update:generate_dispatchers
新增它們)。 - Rails 指南已從 AsciiDoc 轉換為 Textile 標記。
- 腳手架檢視和控制器已經清理了一點。
-
script/server
現在接受--path
引數以從特定路徑掛載 Rails 應用程式。 - 如果缺少任何配置的 gem,gem rake 任務將跳過載入大部分環境。這應該可以解決許多“先決條件”問題,其中 rake gems:install 無法執行,因為 gems 丟失。
- 寶石現在只被開啟一次。這解決了 gems(例如 hoe)的問題,這些 gems 對檔案具有隻讀許可權。
9 已棄用
此版本中棄用了一些舊程式碼:
- 如果您是以依賴檢查器、收割者和生成器指令碼的方式進行部署的(相當罕見的)Rails 開發人員之一,您需要知道這些指令碼不再包含在核心 Rails 中。如果您需要它們,您可以通過 irs_process_scripts 外掛獲取副本。
-
render_component
在 Rails 2.3 中從“棄用”變為“不存在”。如果還需要,可以安裝render_component 外掛。 - 移除了對 Rails 元件的支援。
- 如果您是習慣執行
script/performance/request
以根據整合測試檢視效能的人之一,那麼您需要學習一個新技巧:該指令碼現在已從核心 Rails 中刪除。您可以安裝一個新的 request_profiler 外掛來獲得完全相同的功能。 -
ActionController::Base#session_enabled?
已被棄用,因為會話現在是延遲載入的。 - 不推薦使用
protect_from_forgery
的:digest
和:secret
選項並且沒有效果。 - 一些整合測試助手已被刪除。
response.headers["Status"]
和headers["Status"]
將不再返回任何內容。 Rack 不允許在其返回標頭中包含“狀態”。但是你仍然可以使用status
和status_message
助手。response.headers["cookie"]
和headers["cookie"]
將不再返回任何 CGI cookie。您可以檢查headers["Set-Cookie"]
以檢視原始 cookie 標頭或使用cookies
助手獲取傳送到客戶端的 cookie 的雜湊值。 - 不推薦使用
formatted_polymorphic_url
。使用polymorphic_url
和:format
代替。 -
ActionController::Response#set_cookie
中的:http_only
選項已重新命名為:httponly
。 -
to_sentence
的:connector
和:skip_last_comma
選項已被替換為:words_connector
、:two_words_connector
和:last_word_connector
選項。 - 釋出一個帶有空
file_field
控制元件的多部分表單,用於向控制器提交一個空字串。由於 Rack 的多部分解析器和舊的 Rails 解析器之間的差異,現在它提交了一個 nil。
10 學分
Mike Gunderloy 編譯的發行說明。此版本的 Rails 2.3 發行說明是基於 Rails 2.3 的 RC2 編譯的。
回饋
我們鼓勵您幫助提高本指南的品質。
如果您發現任何拼寫錯誤或資訊錯誤,請提供回饋。 要開始回饋,您可以閱讀我們的 回饋 部分。
您還可能會發現不完整的內容或不是最新的內容。 請務必為 main 新增任何遺漏的文件。假設是 非穩定版指南(edge guides) 請先驗證問題是否已經在主分支上解決。 請前往 Ruby on Rails 指南寫作準則 查看寫作風格和慣例。
如果由於某種原因您發現要修復的內容但無法自行修補,請您 提出 issue。
關於 Ruby on Rails 的任何類型的討論歡迎提供任何文件至 rubyonrails-docs 討論區。