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。這個 Gemfile
由 Bundler gem 處理,然後安裝所有依賴項。它甚至可以將所有依賴項本地安裝到您的應用程序中,以便它不依賴於系統 Gems。
更多信息:Bundler 主頁
2.2 生活在邊緣
Bundler
和 Gemfile
使得使用新的專用 bundle
命令凍結您的 Rails 應用程序變得非常簡單。如果您想直接從 Git 存儲庫捆綁,可以使用 --edge
標誌:
$ rails new myapp --edge
如果您有一個本地的 Rails 存儲庫並且想要使用它生成應用程序,可以使用 --dev
標誌:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 主要功能
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
中,即可恢復功能。
- 基於哈希和動態查找方法(GitHub)
- 在Active Record模型中的賦值保護(GitHub,Pull Request)
- ActiveRecord::SessionStore(GitHub,Pull Request)
- Active Record觀察者(GitHub,Commit)
- Active Resource(GitHub,Pull Request,Blog)
- Action Caching(GitHub,Pull Request)
- Page Caching(GitHub,Pull Request)
- Sprockets(GitHub)
- 性能測試(GitHub,Pull Request)
4 文檔
指南以GitHub Flavored Markdown重寫。
指南具有響應式設計。
5 Railties
詳細更改請參閱Changelog。
5.1 重要更改
新的測試位置
test/models
,test/helpers
,test/controllers
和test/mailers
。相應的rake任務也已添加。 (Pull Request)應用程序的可執行文件現在位於
bin/
目錄中。運行rake rails:update:bin
以獲取bin/bundle
,bin/rails
和bin/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
以減少內存和處理開銷。可以根據區域設定定義變形。
singularize
和pluralize
接受區域作為額外參數。如果接收對象未實現該方法,
Object#try
現在將返回nil而不是引發NoMethodError,但您仍然可以使用新的Object#try!
獲得舊的行為。當給定無效日期時,
String#to_date
現在引發ArgumentError: invalid date
而不是NoMethodError: undefined method 'div' for nil:NilClass
。它現在與Date.parse
相同,並且接受比3.x更多的無效日期,例如: ```rubyActiveSupport 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 ```
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_present
和assert_blank
,改用assert object.blank?
和assert object.present?
9 Action Pack
詳細變更請參閱 Changelog。
9.1 重要變更
- 改變開發模式下異常頁面的樣式表。同時在所有異常頁面中顯示引發異常的程式碼行和片段。
9.2 廢棄項目
10 Active Record
詳細變更請參閱 Changelog。
10.1 重要變更
改進了編寫
change
遷移的方式,不再需要舊的up
和down
方法。添加了對 PostgreSQL 陣列類型的支援。可以使用任何數據類型來創建陣列列,並提供完整的遷移和模式轉儲支援。
添加了
Relation#load
方法,用於顯式加載記錄並返回self
。Model.all
現在返回一個ActiveRecord::Relation
,而不是記錄的數組。如果真的需要數組,請使用Relation#to_a
。在某些特定情況下,這可能導致升級時出現問題。添加了
ActiveRecord::Migration.check_pending!
,如果有待遷移,則引發錯誤。為
ActiveRecord::Store
添加了自定義編碼器支援。現在可以像這樣設置自定義編碼器:store :settings, accessors: [ :color, :homepage ], coder: JSON
mysql
和mysql2
的連接默認會設置SQL_MODE=STRICT_ALL_TABLES
,以避免靜默數據丟失。可以通過在database.yml
中指定strict: false
來禁用此功能。刪除 IdentityMap。
刪除自動執行 EXPLAIN 查詢的功能。選項
active_record.auto_explain_threshold_in_seconds
不再使用,應該刪除。添加
ActiveRecord::NullRelation
和ActiveRecord::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 論壇 上進行。