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 應用程式可以使用新的 Webpacker gem 更輕鬆地與 JavaScript 資產打包器 Webpack 整合。在產生新的應用程式時使用 --webpack
旗標啟用 Webpack 整合。
這與資產管線完全相容,您仍然可以將它用於圖片、字型、聲音和其他資產。您甚至可以讓某些 JavaScript 程式碼由資產管線管理,並透過 Webpack 處理其他程式碼。所有這些都由預設啟用的 Yarn 管理。
2.3 jQuery 不再是預設相依性
在舊版的 Rails 中,預設需要 jQuery 來提供 data-remote
、data-confirm
和 Rails 非侵入式 JavaScript 產品的其他部分等功能。現在不再需要它,因為 UJS 已重寫為使用純 JavaScript。此程式碼現在以 rails-ujs
的形式在 Action View 中提供。
如果需要,您仍然可以使用 jQuery,但它不再是預設要求。
2.4 系統測試
Rails 5.1 以系統測試的形式,內建支援撰寫 Capybara 測試。您不再需要擔心設定 Capybara 和此類測試的資料庫清除策略。Rails 5.1 提供一個包裝函式,用於在 Chrome 中執行測試,並提供額外的功能,例如失敗螢幕截圖。
2.5 加密密鑰
Rails 現在允許以安全的方式管理應用程式密鑰,靈感來自於 sekrets gem。
執行 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 在路由 DSL 中新增了兩個新方法 resolve
和 direct
。resolve
方法允許自訂模型的 Polymorphic 對應。
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
和用於自訂 URL 的 form_tag
。
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 連線包裝在資料庫交易中。
當測試產生額外的執行緒,而這些執行緒取得資料庫連線時,現在會特別處理這些連線
這些執行緒將共用單一連線,該連線位於受管理的交易內部。這可確保所有執行緒在相同的狀態下檢視資料庫,忽略最外層的交易。先前,例如,此類額外連線無法看到 fixture 列。
當執行緒進入巢狀交易時,它將暫時取得對連線的獨佔使用權,以維持隔離。
如果您的測試目前依賴於在產生的執行緒中取得單獨的、在交易外的連線,您將需要切換到更明確的連線管理。
如果您的測試產生執行緒,且這些執行緒在同時使用明確的資料庫交易時進行互動,則此變更可能會導致死鎖。
選擇退出此新行為的簡單方法是針對任何受影響的測試案例停用交易式測試。
4 Railties
如需詳細變更,請參閱變更日誌。
4.1 移除
移除已棄用的
config.static_cache_control
。(commit)移除已棄用的
config.serve_static_files
。(commit)移除已棄用的檔案
rails/rack/debugger
。(commit)移除已棄用的工作:
rails:update
、rails:template
、rails:template:copy
、rails:update:configs
和rails:update:bin
。(commit)移除已棄用的
routes
工作環境變數CONTROLLER
。(commit)從
rails new
命令中移除 -j (--javascript) 選項。(提取請求)
4.2 值得注意的變更
為
config/secrets.yml
新增一個共用區段,該區段將載入所有環境。(commit)現在載入
config/secrets.yml
設定檔時,所有索引鍵都以符號表示。(提取請求)從預設堆疊中移除 jquery-rails。隨 Action View 提供之 rails-ujs,會做為預設 UJS 配接器一併包含。(提取請求)
在新的應用程式中新增 Yarn 支援,其中包含一個 yarn binstub 和 package.json。(提取請求)
透過
--webpack
選項在新的應用程式中新增 Webpack 支援,該選項將委派給 rails/webpacker gem。(提取請求)在產生新的應用程式時初始化 Git 儲存庫,如果沒有提供
--skip-git
選項。(提取請求)在
config/secrets.yml.enc
中新增加密密鑰。(提取請求)在
rails initializers
中顯示 railtie 類別名稱。(提取請求)
5 Action Cable
請參閱變更日誌以了解詳細變更。
5.1 重要變更
在
cable.yml
中新增對 Redis 和事件驅動 Redis 配接器的channel_prefix
支援,以避免在使用多個應用程式時,使用相同的 Redis 伺服器時發生名稱衝突。(Pull Request)為廣播資料新增
ActiveSupport::Notifications
鉤子。(Pull Request)
6 Action Pack
請參閱變更日誌以了解詳細變更。
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 重要變更
在路由 DSL 中新增了
direct
和resolve
方法。(Pull Request)新增了一個新的
ActionDispatch::SystemTestCase
類別,用於在您的應用程式中編寫系統測試。(Pull Request)
7 Action View
請參閱變更日誌以了解詳細變更。
7.1 移除
移除
ActionView::Template::Error
中已棄用的#original_exception
。(commit)從
strip_tags
中移除encode_special_chars
這個用詞不當的選項。(Pull Request)
7.2 已棄用
- 已棄用 Erubis ERB 處理器,改用 Erubi。(Pull Request)
7.3 重要變更
原始範本處理器(Rails 5 中的預設範本處理器)現在會輸出 HTML 安全的字串。(commit)
變更
datetime_field
和datetime_field_tag
以產生datetime-local
欄位。(Pull Request)HTML 標籤的新建構器樣式語法 (
tag.div
、tag.br
等)。(Pull Request)新增
form_with
以統一form_tag
和form_for
的用法。(Pull Request)為
current_page?
新增check_parameters
選項。(Pull Request)
8 Action Mailer
請參閱變更日誌以了解詳細變更。
8.1 重要變更
允許在包含附件且內嵌設定主體時設定自訂內容類型。(Pull Request)
允許將 lambdas 作為值傳遞給
default
方法。(Commit)新增對郵件程式參數化呼叫的支援,以便在不同的郵件程式動作之間共用 before 篩選器和預設值。(Commit)
將傳入的引數傳遞給
process.action_mailer
事件中的args
鍵下的郵件程式動作。(Pull Request)
9 Active Record
請參閱變更日誌以了解詳細變更。
9.1 移除
移除同時將引數和區塊傳遞給
ActiveRecord::QueryMethods#select
的支援。(Commit)移除已棄用的
activerecord.errors.messages.restrict_dependent_destroy.one
和activerecord.errors.messages.restrict_dependent_destroy.many
i18n 範圍。(Commit)移除單數和集合關聯讀取器中已棄用的強制重新載入引數。(Commit)
移除將欄位傳遞給
#quote
的已棄用支援。(Commit)從
#tables
中移除已棄用的name
引數。(Commit)移除
#tables
和#table_exists?
的已棄用行為,使其返回表格和檢視,現在只返回表格而不返回檢視。(Commit)移除
ActiveRecord::StatementInvalid#initialize
和ActiveRecord::StatementInvalid#original_exception
中已棄用的original_exception
引數。(Commit)移除在查詢中將類別作為值傳遞的已棄用支援。(Commit)
移除在 LIMIT 上使用逗號查詢的已棄用支援。(Commit)
從
#destroy_all
中移除已棄用的conditions
參數。(Commit)從
#delete_all
中移除已棄用的conditions
參數。(Commit)移除已棄用的
#load_schema_for
方法,改用#load_schema
。(Commit)移除已棄用的
#raise_in_transactional_callbacks
設定。(Commit)移除已棄用的
#use_transactional_fixtures
設定。(Commit)
9.2 已棄用
已棄用
error_on_ignored_order_or_limit
旗標,改用error_on_ignored_order
。(Commit)已棄用
sanitize_conditions
,改用sanitize_sql
。(Pull Request)已棄用連線配接器上的
supports_migrations?
。(Pull Request)已棄用
Migrator.schema_migrations_table_name
,改用SchemaMigration.table_name
。(Pull Request)已棄用在引述和類型轉換中使用
#quoted_id
。(Pull Request)已棄用將
default
引數傳遞給#index_name_exists?
。(Pull Request)
9.3 重要變更
將預設主鍵變更為 BIGINT。(Pull Request)
支援 MySQL 5.7.5+ 和 MariaDB 5.2.0+ 的虛擬/產生欄位。(Commit)
新增對批次處理中限制的支援。(Commit)
交易測試現在會將所有 Active Record 連線包裝在資料庫交易中。(Pull Request)
預設跳過
mysqldump
命令輸出中的註解。(Pull Request)修正當區塊作為引數傳遞時,
ActiveRecord::Relation#count
使用 Ruby 的Enumerable#count
來計數記錄,而不是默默地忽略傳遞的區塊。(Pull Request)將
"-v ON_ERROR_STOP=1"
旗標與psql
命令一起傳遞,以防止 SQL 錯誤遭到抑制。(Pull Request)新增
ActiveRecord::Base.connection_pool.stat
。(Pull Request)直接從
ActiveRecord::Migration
繼承會引發錯誤。請指定撰寫遷移的 Rails 版本。(Commit)當
through
關聯具有不明確的反射名稱時,會引發錯誤。(Commit)
10 Active Model
請參閱變更日誌以了解詳細變更。
10.1 移除
移除
ActiveModel::Errors
中已棄用的方法。(commit)移除長度驗證器中已棄用的
:tokenizer
選項。(commit)移除當回傳值為 false 時會停止回呼的已棄用行為。(commit)
10.2 重要變更
- 指派給模型屬性的原始字串不再會錯誤地凍結。(Pull Request)
11 Active Job
請參閱變更日誌以了解詳細變更。
11.1 移除
移除對將配接器類別傳遞給
.queue_adapter
的已棄用支援。(commit)移除
ActiveJob::DeserializationError
中已棄用的#original_exception
。(commit)
11.2 重要變更
新增透過
ActiveJob::Base.retry_on
和ActiveJob::Base.discard_on
進行宣告式例外處理。(Pull Request)產生工作實例,以便在重試失敗後,您可以在自訂邏輯中存取諸如
job.arguments
之類的內容。(commit)
12 Active Support
請參閱變更日誌以了解詳細變更。
12.1 移除
移除
ActiveSupport::Concurrency::Latch
類別。(Commit)移除
halt_callback_chains_on_return_false
。(Commit)移除當回傳值為 false 時會停止回呼的已棄用行為。(Commit)
12.2 已棄用
頂層
HashWithIndifferentAccess
類別已被軟性棄用,改用ActiveSupport::HashWithIndifferentAccess
類別。(Pull Request)已棄用將字串傳遞給
set_callback
和skip_callback
上的:if
和:unless
條件選項。(Commit)
12.3 重要變更
修正固定時長的解析和轉換,使其在 DST (日光節約時間) 變更時保持一致性。( Commit, 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 成為穩定且強健的框架。向他們所有人致敬。