v7.1.3.2
更多資訊請至 rubyonrails.org: 更多 Ruby on Rails

Ruby on Rails 4.0 發行說明

Rails 4.0 的重點

此發行說明只涵蓋重大變更。若要了解各種錯誤修正和變更,請參閱變更日誌或查看 GitHub 上 Rails 主要存放庫中的提交清單

1 升級至 Rails 4.0

如果您要升級現有的應用程式,建議在升級之前先做好測試涵蓋範圍。您還應該先升級至 Rails 3.2(如果您尚未升級),並確保您的應用程式在嘗試更新至 Rails 4.0 之前仍能如預期般執行。在 升級 Ruby on Rails 指南中提供了升級時需要注意的事項清單。

2 建立 Rails 4.0 應用程式

# You should have the 'rails' RubyGem installed
$ rails new myapp
$ cd myapp

2.1 供應商寶石

Rails 現在在應用程式根目錄中使用 Gemfile 來確定您的應用程式啟動所需的寶石。此 GemfileBundler 寶石處理,然後安裝您的所有相依性。它甚至可以將所有相依性安裝到您的應用程式中,這樣就不會依賴系統寶石。

更多資訊:Bundler 主頁

2.2 處於邊緣

BundlerGemfile 使得凍結您的 Rails 應用程式變得非常容易,就像使用新的專用 bundle 指令一樣。如果您想直接從 Git 儲存庫進行套件,您可以傳遞 --edge 旗標

$ rails new myapp --edge

如果您有 Rails 儲存庫的本地結帳,並想使用它來產生應用程式,您可以傳遞 --dev 旗標

$ ruby /path/to/rails/railties/bin/rails new myapp --dev

3 主要功能

Rails 4.0

3.1 升級

  • Ruby 1.9.3 (提交) - 優先使用 Ruby 2.0;需要 1.9.3+
  • 新的棄用政策 - 已棄用的功能在 Rails 4.0 中是警告,並會在 Rails 4.1 中移除。
  • ActionPack 頁面和動作快取 (提交) - 頁面和動作快取已抽取到一個獨立的 gem。頁面和動作快取需要太多手動介入(在底層模型物件更新時手動讓快取過期)。改用 Russian doll 快取。
  • ActiveRecord 觀察器 (提交) - 觀察器已抽取到一個獨立的 gem。觀察器只在頁面和動作快取中需要,而且會導致程式碼雜亂。
  • ActiveRecord 會話儲存 (提交) - ActiveRecord 會話儲存已抽取到一個獨立的 gem。在 SQL 中儲存會話很耗費成本。改用 cookie 會話、memcache 會話或自訂的會話儲存。
  • ActiveModel 大量指派保護 (提交) - Rails 3 大量指派保護已棄用。改用強參數。
  • ActiveResource (提交) - ActiveResource 已抽取到一個獨立的 gem。ActiveResource 並未廣泛使用。
  • 移除 vendor/plugins (提交) - 使用 Gemfile 來管理已安裝的 gem。

3.2 ActionPack

  • 強參數 (提交) - 只允許已核准的參數來更新模型物件(params.permit(:title, :text))。
  • 路由問題 (提交) - 在路由 DSL 中,分解出常見的子路由(/posts/1/comments/videos/1/comments 中的 comments)。
  • ActionController::Live (提交) - 使用 response.stream 串流 JSON。
  • 宣告式 ETag (提交) - 加入控制器層級的 etag 新增,這會成為動作 etag 計算的一部分。
  • 俄羅斯娃娃快取 (提交) - 快取巢狀的檢視片段。每個片段會根據一組相依性(快取金鑰)到期。快取金鑰通常是範本版本號碼和模型物件。
  • Turbolinks (提交) - 只提供一個初始 HTML 頁面。當使用者導覽到其他頁面時,使用 pushState 更新網址,並使用 AJAX 更新標題和主體。
  • 將 ActionView 與 ActionController 分離 (提交) - ActionView 已與 ActionPack 分離,並會在 Rails 4.1 中移至一個獨立的 gem。
  • 不依賴 ActiveModel (提交) - ActionPack 不再依賴 ActiveModel。

3.3 一般

  • ActiveModel::Model (提交) - ActiveModel::Model,一個混入模組,讓一般的 Ruby 物件能與 ActionPack 直接搭配使用(例如 form_for
  • 新的範圍 API (提交) - 範圍必須始終使用可呼叫物件。
  • Schema 快取傾印 (提交) - 為了改善 Rails 開機時間,改為從傾印檔案載入 schema,而不是直接從資料庫載入 schema。
  • 支援指定交易隔離層級 (提交) - 選擇可重複讀取或改善效能(較少鎖定)哪個較重要。
  • Dalli (提交) - 使用 Dalli memcache 程式庫作為 memcache 儲存。
  • 通知開始和結束 (提交) - Active Support 儀器會向訂閱者回報開始和結束通知。
  • 預設為執行緒安全 (提交) - Rails 可以執行於執行緒應用程式伺服器,而無需額外設定。

檢查您使用的 gem 是否為執行緒安全。

  • PATCH 動詞 (提交) - 在 Rails 中,PATCH 取代 PUT。PATCH 用於資源的部分更新。

3.4 安全性

  • match 不會捕捉全部 (提交) - 在路由 DSL 中,match 需要指定 HTTP 動詞或動詞。
  • 預設轉譯 HTML 實體 (提交) - 在 erb 中呈現的字串會被轉譯,除非使用 raw 包覆或呼叫 html_safe
  • 新的安全標頭 (提交) - Rails 會在每個 HTTP 要求中傳送下列標頭:X-Frame-Options(禁止瀏覽器將頁面嵌入在框架中,以防止點擊劫持)、X-XSS-Protection(要求瀏覽器停止腳本注入)和 X-Content-Type-Options(防止瀏覽器將 jpeg 開啟為 exe)。

4 將功能萃取到寶石中

在 Rails 4.0 中,已將多項功能萃取到寶石中。您只要將萃取出的寶石新增到 Gemfile 中,即可取回功能。

5 文件

  • 指南已使用 GitHub Flavored Markdown 重寫。

  • 指南具有回應式設計。

6 Railties

有關詳細變更,請參閱 變更日誌

6.1 顯著變更

  • 新的測試位置 test/modelstest/helperstest/controllerstest/mailers。也新增了對應的 rake 任務。(Pull Request)

  • 您的應用程式可執行檔現在位於 bin/ 目錄中。執行 rake rails:update:bin 以取得 bin/bundlebin/railsbin/rake

  • 預設為執行緒安全

  • 已移除傳遞 --builder(或 -b)給 rails new 以使用自訂建構器的功能。請考慮改用應用程式範本。(Pull Request

6.2 已棄用

  • config.threadsafe! 已棄用,建議改用 config.eager_load,它能更精細地控制急切載入的內容。

  • Rails::Plugin 已消失。請勿將外掛程式新增至 vendor/plugins,改用 gem 或 bundler 搭配路徑或 git 相依性。

7 Action Mailer

有關詳細變更,請參閱 變更記錄

7.1 顯著變更

7.2 已棄用

8 Active Model

有關詳細變更,請參閱 變更記錄

8.1 顯著變更

  • 新增 ActiveModel::ForbiddenAttributesProtection,一個簡單的模組,可在傳遞未允許屬性時,保護屬性免於大量指派。

  • 新增 ActiveModel::Model,一個混入,讓 Ruby 物件能立即與 Action Pack 搭配使用。

8.2 已棄用

9 Active Support

有關詳細變更,請參閱 變更記錄

9.1 顯著變更

  • ActiveSupport::Cache::MemCacheStore 中,以 dalli 取代已棄用的 memcache-client gem。

  • 最佳化 ActiveSupport::Cache::Entry 以減少記憶體和處理開銷。

  • 現在可以針對每個地區定義變形。singularizepluralize 接受地區作為額外引數。

  • Object#try 現在會傳回 nil,而不是在接收物件未實作方法時引發 NoMethodError,但你仍可以使用新的 Object#try! 來取得舊有的行為。

  • String#to_date 現在會引發 ArgumentError: invalid date,而不是在給予無效日期時引發 NoMethodError: undefined method 'div' for nil:NilClass。它現在與 Date.parse 相同,而且它接受比 3.x 更多的無效日期,例如

    # ActiveSupport 3.x
    "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    
    # ActiveSupport 4
    "asdf".to_date # => ArgumentError: invalid date
    "333".to_date # => Fri, 29 Nov 2013
    

9.2 棄用

  • 棄用 ActiveSupport::TestCase#pending 方法,改用 minitest 的 skip

  • ActiveSupport::Benchmarkable#silence 已被棄用,因為它缺乏執行緒安全性。它將在 Rails 4.1 中移除,且不會替換。

  • ActiveSupport::JSON::Variable 已被棄用。定義您自己的 #as_json#encode_json 方法,以自訂 JSON 字串文字。

  • 棄用相容性方法 Module#local_constant_names,改用 Module#local_constants(它會傳回符號)。

  • ActiveSupport::BufferedLogger 已被棄用。使用 ActiveSupport::Logger 或 Ruby 標準函式庫的記錄器。

  • 棄用 assert_presentassert_blank,改用 assert object.blank?assert object.present?

10 Action Pack

請參閱 變更日誌 以取得詳細變更。

10.1 顯著變更

  • 變更開發模式的例外頁面樣式表。此外,也顯示引發例外情況的所有例外頁面中的程式碼行和片段。

10.2 棄用

11 Active Record

請參閱 變更日誌 以取得詳細變更。

11.1 顯著變更

  • 改善撰寫 change 移轉的方式,讓舊有的 updown 方法不再必要。

    • 方法 drop_tableremove_column 現在是可逆的,只要提供必要的資訊即可。方法 remove_column 過去可以接受多個欄位名稱;現在改用 remove_columns(不可逆)。方法 change_table 也是可逆的,只要其區塊不會呼叫 removechangechange_default
    • 新的方法 reversible 可讓您指定在往上或往下遷移時執行的程式碼。請參閱 遷移指南
    • 新的方法 revert 將還原整個遷移或指定的區塊。如果往下遷移,指定的遷移/區塊將正常執行。請參閱 遷移指南
  • 新增 PostgreSQL 陣列類型支援。任何資料類型都可以用來建立陣列欄位,並提供完整的遷移和架構傾印支援。

  • 新增 Relation#load 以明確載入記錄並傳回 self

  • Model.all 現在傳回 ActiveRecord::Relation,而不是記錄陣列。如果您真的想要陣列,請使用 Relation#to_a。在某些特定情況下,這可能會在升級時造成中斷。

  • 新增 ActiveRecord::Migration.check_pending!,如果遷移待處理,它會引發錯誤。

  • 新增 ActiveRecord::Store 的自訂編碼器支援。現在您可以這樣設定自訂編碼器

    store :settings, accessors: [ :color, :homepage ], coder: JSON
    
  • mysqlmysql2 連線預設會設定 SQL_MODE=STRICT_ALL_TABLES 以避免資料靜默遺失。您可以在 database.yml 中指定 strict: false 來停用此功能。

  • 移除 IdentityMap。

  • 移除自動執行 EXPLAIN 查詢。選項 active_record.auto_explain_threshold_in_seconds 已不再使用,應予以移除。

  • 新增 ActiveRecord::NullRelationActiveRecord::Relation#none,為 Relation 類別實作空物件模式。

  • 新增 create_join_table 遷移輔助程式,用於建立 HABTM 連接表。

  • 允許建立 PostgreSQL hstore 記錄。

11.2 已棄用

  • 已棄用舊式基於雜湊的 Finder API。這表示先前接受「Finder 選項」的方法不再接受。

  • 除了 find_by_...find_by_...! 之外,所有動態方法都已棄用。以下是重寫程式碼的方法

    • 可以使用 where(...) 重寫 find_all_by_...
    • 可以使用 where(...).last 重寫 find_last_by_...
    • 可以使用 where(...) 重寫 scoped_by_...
    • 可以使用 find_or_initialize_by(...) 重寫 find_or_initialize_by_...
    • 可以使用 find_or_create_by(...) 重寫 find_or_create_by_...
    • 可以使用 find_or_create_by!(...) 重寫 find_or_create_by_...!

12 貢獻者

請參閱 Rails 貢獻者完整清單,了解許多人花費許多時間讓 Rails 成為穩定且強大的架構。向所有這些人致敬。

回饋

我們鼓勵您協助提升本指南的品質。

如果您發現任何錯字或事實錯誤,請協助我們修正。首先,您可以閱讀我們的 文件貢獻 部分。

您也可能會發現不完整或過時的內容。請務必為 main 新增任何遺漏的文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支中修正。請查看 Ruby on Rails 指南準則,了解風格和慣例。

如果您發現需要修正之處,但無法自行修正,請 開啟問題

最後,我們非常歡迎在 官方 Ruby on Rails 論壇 上針對 Ruby on Rails 文件進行任何討論。