1 升級至 Rails 5.1
如果您要升級現有應用程式,在開始前擁有良好的測試涵蓋範圍會是一個很棒的主意。您還應該先升級到 Rails 5.0(如果您尚未升級),並確保您的應用程式在嘗試更新到 Rails 5.1 之前仍能如預期執行。在 升級 Ruby on Rails 指南中提供了升級時需要注意的事項清單。
2 主要功能
2.1 Yarn 支援
Rails 5.1 允許透過 Yarn 從 npm 管理 JavaScript 相依性。這將讓使用 React、VueJS 或 npm 世界中的任何其他函式庫變得容易。Yarn 支援已與資產管線整合,因此所有相依性都能與 Rails 5.1 應用程式無縫運作。
2.2 選擇性 Webpack 支援
Rails 應用程式可以使用 Webpack(一個 JavaScript 資產打包器)進行整合,更輕鬆地使用新的 Webpacker 寶石。在產生新的應用程式時使用 --webpack
旗標,以啟用 Webpack 整合。
這與資產管線完全相容,您可以繼續使用它來處理影像、字型、音效和其他資產。您甚至可以讓部分 JavaScript 程式碼由資產管線管理,而其他程式碼則透過 Webpack 處理。所有這些都由 Yarn 管理,而 Yarn 預設已啟用。
2.3 jQuery 不再是預設相依性
在早期版本的 Rails 中,預設需要 jQuery 來提供 data-remote
、data-confirm
和 Rails 的 Unobtrusive JavaScript 提供的其他部分等功能。現在不再需要它,因為 UJS 已改寫為使用純粹的 JavaScript。此程式碼現在作為 rails-ujs
隨 Action View 一起提供。
您仍然可以在需要時使用 jQuery,但預設不再需要它。
2.4 系統測試
Rails 5.1 已內建支援撰寫 Capybara 測試,以系統測試的形式呈現。您不再需要擔心為此類測試設定 Capybara 和資料庫清理策略。Rails 5.1 提供了一個包裝器,可在 Chrome 中執行測試,並具備額外的功能,例如失敗截圖。
2.5 加密的機密
受到 sekrets 這個 gem 的啟發,Rails 現在允許以安全的方式管理應用程式的機密。
執行 bin/rails secrets:setup
來設定新的加密機密檔案。這也會產生一個主金鑰,必須儲存在儲存庫之外。機密本身可以安全地以加密的形式檢查到版本控制系統中。
機密會在生產環境中解密,使用儲存在 RAILS_MASTER_KEY
環境變數或金鑰檔案中的金鑰。
2.6 參數化的郵件
允許指定用於郵件類別中所有方法的常見參數,以分享執行個體變數、標頭和其他常見設定。
class InvitationsMailer < ApplicationMailer
before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
before_action { @account = params[:inviter].account }
def account_invitation
mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
end
end
InvitationsMailer.with(inviter: person_a, invitee: person_b)
.account_invitation.deliver_later
2.7 直接和解析的路由
Rails 5.1 新增兩個新方法 resolve
和 direct
到路由 DSL。resolve
方法允許自訂模型的多型對應。
resource :basket
resolve("Basket") { [:basket] }
<%= form_for @basket do |form| %>
<!-- basket form -->
<% end %>
這會產生單數 URL /basket
,而不是通常的 /baskets/:id
。
direct
方法允許建立自訂 URL 輔助程式。
direct(:homepage) { "https://rubyonrails.org" }
homepage_url # => "https://rubyonrails.org"
區塊的回傳值必須是 url_for
方法的有效引數。因此,您可以傳遞有效的字串 URL、雜湊、陣列、Active Model 執行個體或 Active Model 類別。
direct :commentable do |model|
[ model, anchor: model.dom_id ]
end
direct :main do
{ controller: 'pages', action: 'index', subdomain: 'www' }
end
2.8 將 form_for 和 form_tag 統一成 form_with
在 Rails 5.1 之前,有兩個介面用於處理 HTML 表單:form_for
用於模型執行個體,form_tag
用於自訂 URL。
Rails 5.1 將這兩個介面與 form_with
結合,並且可以根據 URL、範圍或模型產生表單標籤。
僅使用 URL
<%= form_with url: posts_path do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Will generate %>
<form action="/posts" method="post" data-remote="true">
<input type="text" name="title">
</form>
新增範圍會為輸入欄位名稱加上前綴
<%= form_with scope: :post, url: posts_path do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Will generate %>
<form action="/posts" method="post" data-remote="true">
<input type="text" name="post[title]">
</form>
使用模型會推論 URL 和範圍
<%= form_with model: Post.new do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Will generate %>
<form action="/posts" method="post" data-remote="true">
<input type="text" name="post[title]">
</form>
現有模型會建立更新表單並填寫欄位值
<%= form_with model: Post.first do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Will generate %>
<form action="/posts/1" method="post" data-remote="true">
<input type="hidden" name="_method" value="patch">
<input type="text" name="post[title]" value="<the title of the post>">
</form>
3 不相容性
下列變更可能需要在升級時立即採取行動。
3.1 使用多個連線的事務測試
事務測試現在會將所有 Active Record 連線包裝在資料庫事務中。
當測試產生其他執行緒,且這些執行緒取得資料庫連線時,這些連線現在會以特殊方式處理
這些執行緒會共用一個連線,而該連線位於受管理的事務中。這可確保所有執行緒都看到資料庫處於相同的狀態,而忽略最外層的事務。例如,先前這些其他連線無法看到固定資料列。
當執行緒進入巢狀事務時,它會暫時取得連線的獨佔使用權,以維護隔離性。
如果您的測試目前依賴於在產生執行緒中取得一個獨立的、在事務之外的連線,您需要切換到更明確的連線管理。
如果您的測試產生執行緒,且這些執行緒在互動時也使用明確的資料庫事務,這個變更可能會導致死結。
選擇退出這個新行為的簡單方法是在任何受影響的測試案例中停用事務測試。
4 Railties
請參閱 變更日誌 以取得詳細變更。
4.1 移除
移除已棄用的
config.static_cache_control
。(提交)移除已棄用的
config.serve_static_files
。(提交)移除已棄用的檔案
rails/rack/debugger
。(提交)移除已棄用的任務:
rails:update
、rails:template
、rails:template:copy
、rails:update:configs
和rails:update:bin
。(提交)移除
routes
任務已棄用的CONTROLLER
環境變數。(提交)移除
rails new
指令的 -j (--javascript) 選項。(Pull Request)
4.2 顯著變更
新增一個共用區段至
config/secrets.yml
,將載入所有環境。(提交)設定檔
config/secrets.yml
現在會載入,所有金鑰都為符號。(Pull Request)從預設堆疊中移除 jquery-rails。隨 Action View 附帶的 rails-ujs 已包含為預設 UJS 介接器。(Pull Request)
在新的應用程式中新增 Yarn 支援,包含 yarn binstub 和 package.json。(Pull Request)
透過
--webpack
選項在新的應用程式中新增 Webpack 支援,將委派給 rails/webpacker gem。(Pull Request)產生新的應用程式時初始化 Git 儲存庫,如果未提供
--skip-git
選項。(Pull Request)在
config/secrets.yml.enc
中新增加密的機密。(Pull Request)在
rails initializers
中顯示 railtie 類別名稱。(Pull Request)
5 Action Cable
請參閱 變更日誌,了解詳細變更。
5.1 顯著變更
在
cable.yml
中新增對 Redis 和事件驅動 Redis 介接器的channel_prefix
支援,以避免在使用同一個 Redis 伺服器與多個應用程式時發生名稱衝突。(Pull Request)加入
ActiveSupport::Notifications
掛勾以廣播資料。(Pull Request)
6 Action Pack
請參閱 Changelog 以取得詳細變更。
6.1 移除
移除
ActionDispatch::IntegrationTest
和ActionController::TestCase
類別中#process
、#get
、#post
、#patch
、#put
、#delete
和#head
的非關鍵字參數支援。(Commit,Commit)移除已棄用的
ActionDispatch::Callbacks.to_prepare
和ActionDispatch::Callbacks.to_cleanup
。(Commit)移除與控制器篩選器相關的已棄用方法。(Commit)
移除對在
ActionController::Parameters
上呼叫HashWithIndifferentAccess
方法的已棄用支援。(Commit)
6.2 已棄用
- 已棄用
config.action_controller.raise_on_unfiltered_parameters
。它在 Rails 5.1 中沒有任何效果。(Commit)
6.3 顯著變更
加入
direct
和resolve
方法到路由 DSL。(Pull Request)新增一個
ActionDispatch::SystemTestCase
類別,用於在應用程式中撰寫系統測試。(Pull Request)
7 Action View
有關詳細變更,請參閱 變更記錄。
7.1 移除
移除
ActionView::Template::Error
中已棄用的#original_exception
。(提交)從
strip_tags
中移除encode_special_chars
這個錯誤的名稱。(Pull Request)
7.2 已棄用
- 已棄用 Erubis ERB 處理程式,建議使用 Erubi。(Pull Request)
7.3 值得注意的變更
原始範本處理程式(Rails 5 中的預設範本處理程式)現在會輸出 HTML 安全字串。(提交)
變更
datetime_field
和datetime_field_tag
以產生datetime-local
欄位。(Pull Request)HTML 標籤的新 Builder 風格語法(
tag.div
、tag.br
等)(Pull Request)新增
form_with
以統一form_tag
和form_for
的使用方式。(Pull Request)新增
check_parameters
選項到current_page?
。(Pull Request)
8 Action Mailer
有關詳細變更,請參閱 變更記錄。
8.1 值得注意的變更
允許在包含附件且內嵌設定主體時設定自訂內容類型。(Pull Request)
允許將 lambda 作為值傳遞給
default
方法。(提交)新增對郵件程式參數化呼叫的支持,以在不同的郵件程式動作之間分享前置過濾器和預設值。(提交)
將傳入參數傳遞給
process.action_mailer
事件下的郵件程式動作,鍵為args
。(拉取請求)
9 Active Record
請參閱 變更日誌 以取得詳細變更。
9.1 移除
移除同時傳遞參數和區塊給
ActiveRecord::QueryMethods#select
的支援。(提交)移除已棄用的
activerecord.errors.messages.restrict_dependent_destroy.one
和activerecord.errors.messages.restrict_dependent_destroy.many
i18n 範圍。(提交)移除單數和集合關聯讀取器中已棄用的強制重新載入參數。(提交)
移除傳遞欄位給
#quote
的已棄用支援。(提交)移除
#tables
中已棄用的name
參數。(提交)移除
#tables
和#table_exists?
的已棄用行為,即傳回表格和檢視,只傳回表格而不傳回檢視。(提交)移除
ActiveRecord::StatementInvalid#initialize
和ActiveRecord::StatementInvalid#original_exception
中已棄用的original_exception
參數。(提交)移除傳遞類別作為查詢中值的已棄用支援。(提交)
移除使用逗號查詢 LIMIT 的已棄用支援。(提交)
從
#destroy_all
中移除已棄用的conditions
參數。(提交)從
#delete_all
中移除已棄用的conditions
參數。(提交)移除已棄用的方法
#load_schema_for
,改用#load_schema
。(提交)移除已棄用的設定檔
#raise_in_transactional_callbacks
。(提交)移除已棄用的設定檔
#use_transactional_fixtures
。(提交)
9.2 棄用
棄用
error_on_ignored_order_or_limit
標記,改用error_on_ignored_order
。(提交)棄用
sanitize_conditions
,改用sanitize_sql
。(拉取請求)棄用連接器適配器上的
supports_migrations?
。(拉取請求)棄用
Migrator.schema_migrations_table_name
,改用SchemaMigration.table_name
。(拉取請求)棄用在引用和類型轉換中使用
#quoted_id
。(拉取請求)棄用傳遞
default
參數給#index_name_exists?
。(拉取請求)
9.3 顯著變更
將預設主鍵變更為 BIGINT。(拉取請求)
針對 MySQL 5.7.5+ 和 MariaDB 5.2.0+ 新增虛擬/產生欄位支援。(提交)
新增對批次處理中限制的支援。(提交)
交易測試現在會將所有 Active Record 連接包裝在資料庫交易中。(拉取請求)
預設略過
mysqldump
命令輸出的註解。(Pull Request)修正
ActiveRecord::Relation#count
,在傳入區塊作為參數時,使用 Ruby 的Enumerable#count
計算記錄數量,而不是靜默略過傳入的區塊。(Pull Request)在
psql
命令中傳遞"-v ON_ERROR_STOP=1"
旗標,以不抑制 SQL 錯誤。(Pull Request)新增
ActiveRecord::Base.connection_pool.stat
。(Pull Request)直接繼承自
ActiveRecord::Migration
會引發錯誤。請指定撰寫遷移的 Rails 版本。(Commit)當
through
關聯具有不明確的反射名稱時,會引發錯誤。(Commit)
10 Active Model
請參閱 Changelog 以取得詳細變更。
10.1 移除
移除
ActiveModel::Errors
中已棄用的方法。(commit)移除長度驗證器中已棄用的
:tokenizer
選項。(commit)移除已棄用的行為,即在回傳值為 false 時停止回呼。(commit)
10.2 顯著變更
- 指定給模型屬性的原始字串不再錯誤地凍結。(Pull Request)
11 Active Job
請參閱 Changelog 以取得詳細變更。
11.1 移除
移除已棄用的支援,即傳遞適配器類別給
.queue_adapter
。(commit)已移除
ActiveJob::DeserializationError
中已棄用的#original_exception
。(提交)
11.2 顯著變更
透過
ActiveJob::Base.retry_on
和ActiveJob::Base.discard_on
新增宣告式例外處理。(Pull Request)在重試失敗後,讓您存取
job.arguments
等項目,以使用自訂邏輯。(提交)
12 Active Support
請參閱 變更日誌 以取得詳細變更。
12.1 移除
已移除
ActiveSupport::Concurrency::Latch
類別。(提交)已移除
halt_callback_chains_on_return_false
。(提交)已移除在回傳值為 false 時暫停回呼的已棄用行為。(提交)
12.2 已棄用
頂層
HashWithIndifferentAccess
類別已漸漸棄用,建議改用ActiveSupport::HashWithIndifferentAccess
。(Pull Request)已棄用在
set_callback
和skip_callback
上的條件式選項:if
和:unless
傳遞字串。(提交)
12.3 顯著變更
已修正期間剖析和移動,以在不同 DST 變更中保持一致。(提交, Pull Request)
已更新 Unicode 至版本 9.0.0。(Pull Request)
新增 Duration#before 和 #after 作為 #ago 和 #since 的別名。(Pull Request)
新增
Module#delegate_missing_to
,將未定義於目前物件的方法呼叫委派給代理物件。(Pull Request)新增
Date#all_day
,傳回表示目前日期和時間整天的範圍。(Pull Request)引入
assert_changes
和assert_no_changes
方法供測試使用。(Pull Request)travel
和travel_to
方法現在會在巢狀呼叫時引發例外。(Pull Request)更新
DateTime#change
以支援 usec 和 nsec。(Pull Request)
13 位貢獻者
請參閱 Rails 貢獻者完整清單,了解許多人花費許多時間讓 Rails 成為穩定且強大的架構。向他們所有人致敬。
回饋
我們鼓勵您協助提升本指南的品質。
如果您發現任何錯字或事實錯誤,請協助我們修正。您可以閱讀我們的 文件貢獻 章節,了解如何開始。
您也可能會發現不完整的內容或未更新的內容。請協助新增任何 main 的遺漏文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支中修正。查看 Ruby on Rails Guides 指南,了解風格和慣例。
如果您發現需要修正的地方,但無法自行修正,請 開啟問題。
最後但同樣重要的是,任何有關 Ruby on Rails 文件的討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。