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

Ruby on Rails 5.1 版本說明

Rails 5.1 的亮點

這些版本說明僅涵蓋主要變更。若要深入了解各種錯誤修正和變更,請參閱變更日誌或查看 GitHub 上 Rails 主要儲存庫中的提交清單

1 升級至 Rails 5.1

如果您要升級現有應用程式,在開始前擁有良好的測試涵蓋範圍會是一個很棒的主意。您還應該先升級到 Rails 5.0(如果您尚未升級),並確保您的應用程式在嘗試更新到 Rails 5.1 之前仍能如預期執行。在 升級 Ruby on Rails 指南中提供了升級時需要注意的事項清單。

2 主要功能

2.1 Yarn 支援

Pull Request

Rails 5.1 允許透過 Yarn 從 npm 管理 JavaScript 相依性。這將讓使用 React、VueJS 或 npm 世界中的任何其他函式庫變得容易。Yarn 支援已與資產管線整合,因此所有相依性都能與 Rails 5.1 應用程式無縫運作。

2.2 選擇性 Webpack 支援

Pull Request

Rails 應用程式可以使用 Webpack(一個 JavaScript 資產打包器)進行整合,更輕鬆地使用新的 Webpacker 寶石。在產生新的應用程式時使用 --webpack 旗標,以啟用 Webpack 整合。

這與資產管線完全相容,您可以繼續使用它來處理影像、字型、音效和其他資產。您甚至可以讓部分 JavaScript 程式碼由資產管線管理,而其他程式碼則透過 Webpack 處理。所有這些都由 Yarn 管理,而 Yarn 預設已啟用。

2.3 jQuery 不再是預設相依性

Pull Request

在早期版本的 Rails 中,預設需要 jQuery 來提供 data-remotedata-confirm 和 Rails 的 Unobtrusive JavaScript 提供的其他部分等功能。現在不再需要它,因為 UJS 已改寫為使用純粹的 JavaScript。此程式碼現在作為 rails-ujs 隨 Action View 一起提供。

您仍然可以在需要時使用 jQuery,但預設不再需要它。

2.4 系統測試

Pull Request

Rails 5.1 已內建支援撰寫 Capybara 測試,以系統測試的形式呈現。您不再需要擔心為此類測試設定 Capybara 和資料庫清理策略。Rails 5.1 提供了一個包裝器,可在 Chrome 中執行測試,並具備額外的功能,例如失敗截圖。

2.5 加密的機密

Pull Request

受到 sekrets 這個 gem 的啟發,Rails 現在允許以安全的方式管理應用程式的機密。

執行 bin/rails secrets:setup 來設定新的加密機密檔案。這也會產生一個主金鑰,必須儲存在儲存庫之外。機密本身可以安全地以加密的形式檢查到版本控制系統中。

機密會在生產環境中解密,使用儲存在 RAILS_MASTER_KEY 環境變數或金鑰檔案中的金鑰。

2.6 參數化的郵件

Pull Request

允許指定用於郵件類別中所有方法的常見參數,以分享執行個體變數、標頭和其他常見設定。

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 直接和解析的路由

Pull Request

Rails 5.1 新增兩個新方法 resolvedirect 到路由 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

Pull Request

在 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:updaterails:templaterails:template:copyrails:update:configsrails: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::IntegrationTestActionController::TestCase 類別中 #process#get#post#patch#put#delete#head 的非關鍵字參數支援。(CommitCommit

  • 移除已棄用的 ActionDispatch::Callbacks.to_prepareActionDispatch::Callbacks.to_cleanup。(Commit

  • 移除與控制器篩選器相關的已棄用方法。(Commit

  • 移除 render 中對 :text:nothing 的已棄用支援。(CommitCommit

  • 移除對在 ActionController::Parameters 上呼叫 HashWithIndifferentAccess 方法的已棄用支援。(Commit

6.2 已棄用

  • 已棄用 config.action_controller.raise_on_unfiltered_parameters。它在 Rails 5.1 中沒有任何效果。(Commit

6.3 顯著變更

  • 加入 directresolve 方法到路由 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_fielddatetime_field_tag 以產生 datetime-local 欄位。(Pull Request

  • HTML 標籤的新 Builder 風格語法(tag.divtag.br 等)(Pull Request

  • 新增 form_with 以統一 form_tagform_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.oneactiverecord.errors.messages.restrict_dependent_destroy.many i18n 範圍。(提交)

  • 移除單數和集合關聯讀取器中已棄用的強制重新載入參數。(提交)

  • 移除傳遞欄位給 #quote 的已棄用支援。(提交)

  • 移除 #tables 中已棄用的 name 參數。(提交)

  • 移除 #tables#table_exists? 的已棄用行為,即傳回表格和檢視,只傳回表格而不傳回檢視。(提交)

  • 移除 ActiveRecord::StatementInvalid#initializeActiveRecord::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_onActiveJob::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_callbackskip_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_changesassert_no_changes 方法供測試使用。(Pull Request)

  • traveltravel_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 論壇 上進行。