v7.0.0
更多資訊請前往 rubyonrails.org: 更多在 Ruby on Rails

不要在 GITHUB 上閱讀此檔案,指南釋出在 https://guides.rubyonrails.org.

Ruby on Rails 2.3 發行說明

Rails 2.3 提供了各種新的和改進的特性,包括普遍的 Rack 整合、對 Rails 引擎的更新支援、Active Record 的巢狀事務、動態和預設範圍、統一渲染、更高效的路由、應用程式模板和安靜的回溯。此列表涵蓋了主要升級,但不包括每個小錯誤修復和更改。如果您想檢視所有內容,請檢視 GitHub 上主 Rails 儲存庫中的 提交列表 或檢視 CHANGELOG 檔案對於單個 Rails 元件。

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 相容的形式。
  • CgiRequestCgiResponse 已被刪除。
  • 會話儲存現在是延遲載入的。如果您在請求期間從不訪問會話物件,它將永遠不會嘗試載入會話資料(解析 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::AbstractRequestActionController::Request 已經統一。新的ActionController::Request 繼承自Rack::Request。這會影響在測試請求中訪問 response.headers['type']。改用response.content_type
  • 如果載入了ActiveRecordActiveRecord::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。

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? }

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 上所做的那樣)。在幕後,巢狀事務 使用儲存點 因此即使在沒有真正巢狀事務的資料庫上也支援它們。在測試期間,還有一些魔法可以使這些事務與事務性裝置很好地配合。

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")

沒有什麼可以定義使用動態範圍:它們只是工作。

4.4 預設範圍

Rails 2.3 將引入 default scopes 的概念,類似於命名範圍,但適用於模型中的所有命名範圍或 find 方法。例如,您可以編寫 default_scope :order => 'name ASC' 並且任何時候您從該模型中檢索記錄時,它們都會按名稱排序(當然,除非您覆蓋該選項)。

### 批量處理

您現在可以使用 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 方法。

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_manyhas_and_belongs_to_many 關聯),用於過濾分組查詢中的記錄。正如那些具有大量 SQL 背景的人所知,這允許基於分組結果進行過濾:

developers = Developer.find(:all, :group => "salary",
  :having => "sum(salary) > 10000", :select => "salary")

4.7 重新連線 MySQL 連線

MySQL 在其連線中支援重新連線標誌 - 如果設定為 true,則客戶端將嘗試重新連線到伺服器,然後在連線丟失的情況下放棄。您現在可以在“database.yml”中為您的 MySQL 連線設定“reconnect = true”,以從 Rails 應用程式中獲取此行為。預設值為 false,因此現有應用程式的行為不會改變。

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_updatebefore_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 程序的一部分執行。

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

5.4 更高效的路由

Rails 2.3 中有幾個重要的路由更改。 formatted_ 路由助手已經消失,只支援傳入 :format 作為選項。這將任何資源的路由生成過程減少了 50% - 並且可以節省大量記憶體(在大型應用程式上高達 100MB)。如果您的程式碼使用 formatted_ 幫助程式,它暫時仍然可以工作 - 但這種行為已被棄用,如果您使用新標準重寫這些路由,您的應用程式將更加高​​效。另一個重大變化是 Rails 現在支援多個路由檔案,而不僅僅是 routes.rb。您可以隨時使用 RouteSet#add_configuration_file 引入更多路由 - 無需清除當前載入的路由。雖然此更改對引擎最有用,但您可以在需要批量載入路由的任何應用程式中使用它。

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,使其能夠乾淨地處理這些替代方案。

5.7 優化respond_to

在 Rails-Merb 團隊合併的一些初步成果中,Rails 2.3 包括對 respond_to 方法的一些優化,該方法當然在許多 Rails 應用程式中大量使用,以允許您的控制器根據 MIME 型別對結果進行不同的格式化。傳入的請求。在消除對 method_missing 的呼叫以及一些分析和調整後,我們看到每秒提供的請求數量提高了 8%,使用簡單的 respond_to 在三種格式之間切換。最好的部分?無需更改應用程式程式碼即可利用此加速。

5.8 改進的快取效能

Rails 現在從遠端快取儲存中保留每個請求的本地讀取快取,減少不必要的讀取並提高站點效能。雖然這項工作最初僅限於“MemCacheStore”,但它可用於任何遠端儲存,而不是實現所需的方法。

5.9 本地化檢視

Rails 現在可以提供本地化檢視,具體取決於您設定的語言環境。例如,假設您有一個帶有“show”動作的“Posts”控制器。預設情況下,這將呈現app/views/posts/show.html.erb。但是如果你設定I18n.locale = :da,它會渲染app/views/posts/show.da.html.erb。如果本地化模板不存在,則將使用未修飾的版本。 Rails 還包括I18n#available_localesI18n::SimpleBackend#available_locales,它們返回當前Rails 專案中可用的翻譯陣列。

此外,您可以使用相同的方案來本地化公共目錄中的救援檔案:例如,public/500.da.htmlpublic/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_filesend_data:type 選項使用符號,例如:send_file("fabulous.png", :type => :png)
  • map.resources:only:except 選項不再被巢狀資源繼承。
  • 捆綁的 memcached 客戶端已更新至 1.6.4.99 版。
  • expires_instale?fresh_when 方法現在接受一個 :public 選項,使它們能夠很好地與代理快取一起工作。
  • :requirements 選項現在可以與其他 RESTful 成員路由一起正常工作。
  • 淺層路由現在正確尊重新命名空間。
  • polymorphic_url 在處理具有不規則複數名稱的物件方面做得更好。

6 動作檢視

Rails 2.3 中的 Action View 選擇了巢狀模型表單、對 render 的改進、更靈活的日期選擇助手提示以及資產快取的加速等。

6.1 巢狀物件表單

如果父模型接受子物件的巢狀屬性(如 Active Record 部分所述),您可以使用 form_forfield_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 %>

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

6.3 提示日期選擇助手

在 Rails 2.3 中,您可以為各種日期選擇助手(date_selecttime_selectdatetime_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'})

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 禁用表單選擇助手的選項標籤

表單選擇助手(例如selectoptions_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

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'

7.4 TimeWithZone 的小數秒

TimeTimeWithZone 類包含一個 xmlschema 方法,以 XML 友好的字串形式返回時間。從 Rails 2.3 開始,TimeWithZone 支援與Time 相同的引數,用於指定返回字串的小數第二部分中的位數:

Time.zone.now.xmlschema(6) # => "2009-01-16T13:00:06.13653Z"

7.5 JSON 鍵引用

如果您在“json.org”站點上查詢規範,您會發現 JSON 結構中的所有鍵都必須是字串,並且它們必須用雙引號引起來。從 Rails 2.3 開始,我們在這裡做了正確的事情,即使是使用數字鍵。

7.6 其他主動支援更改

  • 您可以使用 Enumerable#none? 來檢查所有元素是否與提供的塊匹配。
  • 如果您使用 Active Support delegates 新的 :allow_nil 選項讓您返回nil 而不是在目標物件為 nil 時引發異常。
  • ActiveSupport::OrderedHash:現在實現 each_keyeach_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

這會將模板中的更改分層到專案已經包含的任何程式碼之上。

8.3 更安靜的回溯

基於thoughtbot 的Quiet Backtrace 外掛,它允許您有選擇地從Test::Unit 回溯中刪除行,Rails 2.3 實現了ActiveSupport::BacktraceCleanerRails ::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 的外部副本的依賴項。

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 不允許在其返回標頭中包含“狀態”。但是你仍然可以使用 statusstatus_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 討論區