edge
更多資訊請參考 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 應用程序

# 您應該已經安裝了 'rails' RubyGem
$ rails new myapp
$ cd myapp

2.1 捆綁 Gems

Rails 現在使用應用程序根目錄中的 Gemfile 來確定您的應用程序啟動所需的 Gems。這個 GemfileBundler gem 處理,然後安裝所有依賴項。它甚至可以將所有依賴項本地安裝到您的應用程序中,以便它不依賴於系統 Gems。

更多信息:Bundler 主頁

2.2 生活在邊緣

BundlerGemfile 使得使用新的專用 bundle 命令凍結您的 Rails 應用程序變得非常簡單。如果您想直接從 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 中。頁面和動作快取需要太多手動干預(在底層模型對象更新時手動過期快取)。請改用俄羅斯娃娃快取。
  • ActiveRecord 觀察者提交)- 觀察者被提取到單獨的 gem 中。觀察者僅在頁面和動作快取中需要,並可能導致混亂的代碼。
  • ActiveRecord 會話存儲提交)- ActiveRecord 會話存儲被提取到單獨的 gem 中。在 SQL 中存儲會話是昂貴的。請改用 cookie 會話、memcache 會話或自定義會話存儲。
  • ActiveModel 大量賦值保護提交)- Rails 3 大量賦值保護已棄用。請改用強參數。
  • ActiveResource提交)- ActiveResource 被提取到單獨的 gem 中。ActiveResource 的使用不廣泛。
  • 移除 vendor/plugins提交)- 使用 Gemfile 管理已安裝的 Gems。

    ActionPack

  • Strong parameters (commit) - 只允許允許的參數更新模型物件 (params.permit(:title, :text)).

  • Routing concerns (commit) - 在路由 DSL 中,將常見的子路由因子化 (comments/posts/1/comments/videos/1/comments 中)。

  • ActionController::Live (commit) - 使用 response.stream 串流 JSON。

  • Declarative ETags (commit) - 添加控制器層級的 etag 添加,將成為動作 etag 計算的一部分。

  • Russian doll caching (commit) - 緩存視圖的嵌套片段。每個片段根據一組依賴項(緩存鍵)過期。緩存鍵通常是模板版本號和模型物件。

  • Turbolinks (commit) - 只提供一個初始的 HTML 頁面。當用戶導航到另一個頁面時,使用 pushState 更新 URL,並使用 AJAX 更新標題和內容。

  • 將 ActionView 與 ActionController 解耦 (commit) - ActionView 被解耦自 ActionPack,並將在 Rails 4.1 中移至獨立的 gem 中。

  • 不依賴於 ActiveModel (commit) - ActionPack 不再依賴於 ActiveModel。

3.2 General

  • ActiveModel::Model (commit) - ActiveModel::Model,一個 mixin,使普通的 Ruby 物件可以直接與 ActionPack 一起使用(例如 form_for)。
  • 新的 scope API (commit) - Scopes 必須始終使用可調用對象。
  • Schema cache dump (commit) - 為了改善 Rails 的啟動時間,不再直接從數據庫加載模式,而是從備份文件中加載模式。
  • 支援指定事務隔離級別 (commit) - 選擇可重複讀取或改善性能(較少鎖定)哪個更重要。
  • Dalli (commit) - 使用 Dalli memcache 客戶端作為 memcache 存儲。
  • 通知開始和結束 (commit) - Active Support 儀表板向訂閱者報告開始和結束通知。
  • 默認線程安全 (commit) - Rails 可以在多線程應用程序服務器中運行,無需額外配置。

注意:請確認您使用的 gem 是線程安全的。

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

3.3 Security

  • match 不再捕獲所有 (commit) - 在路由 DSL 中,match 需要指定 HTTP 動詞或動詞。
  • 預設情況下對 HTML 實體進行轉義 (commit) - 在 erb 中呈現的字符串將被轉義,除非使用 raw 包裹或調用 html_safe
  • 新的安全標頭 (commit) - Rails 對每個 HTTP 請求都發送以下標頭:X-Frame-Options(禁止瀏覽器將頁面嵌入框架以防止點擊劫持),X-XSS-Protection(要求瀏覽器停止腳本注入)和 X-Content-Type-Options(防止瀏覽器將 jpeg 文件打開為 exe)。 將功能提取到gems中 ---------------------------

在Rails 4.0中,有幾個功能已經被提取到gems中。您只需將提取的gems添加到您的Gemfile中,即可恢復功能。

4 文檔

  • 指南以GitHub Flavored Markdown重寫。

  • 指南具有響應式設計。

5 Railties

詳細更改請參閱Changelog

5.1 重要更改

  • 新的測試位置test/modelstest/helperstest/controllerstest/mailers。相應的rake任務也已添加。 (Pull Request

  • 應用程序的可執行文件現在位於bin/目錄中。運行rake rails:update:bin以獲取bin/bundlebin/railsbin/rake

  • 默認啟用線程安全

  • 通過將--builder(或-b)傳遞給rails new來使用自定義構建器的能力已被刪除。請考慮使用應用程序模板。 (Pull Request

5.2 廢棄

  • config.threadsafe!已被廢棄,建議使用config.eager_load,它可以更細粒度地控制何時進行急切加載。

  • Rails::Plugin已經被刪除。不要將插件添加到vendor/plugins中,請使用gems或具有路徑或git依賴關係的bundler。

6 Action Mailer

詳細更改請參閱Changelog

6.1 重要更改

6.2 廢棄

7 Active Model

詳細更改請參閱Changelog

7.1 重要更改

  • 添加ActiveModel::ForbiddenAttributesProtection,一個簡單的模塊,用於在傳遞非允許的屬性時保護屬性免受大量賦值。

  • 添加ActiveModel::Model,一個混入,使Ruby對象能夠與Action Pack無縫配合。

7.2 廢棄

8 Active Support

詳細更改請參閱Changelog

8.1 重要更改

  • 將已棄用的memcache-client gem替換為ActiveSupport::Cache::MemCacheStore中的dalli

  • 優化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更多的無效日期,例如: ```ruby

    ActiveSupport 3.x

    "asdf".to_date # => NoMethodError: undefined method div' for nil:NilClass "333".to_date # => NoMethodError: undefined methoddiv' for nil:NilClass

ActiveSupport 4

"asdf".to_date # => ArgumentError: invalid date "333".to_date # => Fri, 29 Nov 2013 ```

8.2 廢棄項目

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

  • ActiveSupport::Benchmarkable#silence 已被廢棄,因為它缺乏線程安全性。在 Rails 4.1 中將被刪除,不會有替代方法。

  • ActiveSupport::JSON::Variable 已被廢棄。請為自定義的 JSON 字串文字定義自己的 #as_json#encode_json 方法。

  • 廢棄了相容性方法 Module#local_constant_names,改用 Module#local_constants(返回符號)。

  • ActiveSupport::BufferedLogger 已被廢棄。使用 ActiveSupport::Logger 或 Ruby 標準庫中的日誌記錄器。

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

9 Action Pack

詳細變更請參閱 Changelog

9.1 重要變更

  • 改變開發模式下異常頁面的樣式表。同時在所有異常頁面中顯示引發異常的程式碼行和片段。

9.2 廢棄項目

10 Active Record

詳細變更請參閱 Changelog

10.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,實現關聯類的空對象模式。

  • 添加 create_join_table 遷移助手,用於創建 HABTM 關聯表。

  • 允許創建 PostgreSQL hstore 記錄。

10.2 廢棄功能

  • 廢棄了舊式的基於哈希的查詢 API。這意味著以前接受“查詢選項”的方法不再接受。

  • 所有動態方法(除了 find_by_...find_by_...!)都已廢棄。以下是如何重寫代碼:

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

11 貢獻者

請參閱Rails的完整貢獻者列表,感謝所有花費了許多時間使Rails成為穩定且強大的框架的人。向他們致敬。

回饋

歡迎協助提升本指南的品質。

如果您發現任何錯別字或事實錯誤,請貢獻您的力量。 開始之前,您可以閱讀我們的 文件貢獻 部分。

您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。

如果您發現需要修復但無法自行修補的問題,請 開啟一個問題

最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。