更多資訊請參考 rubyonrails.org:

Ruby on Rails 5.1 發行說明

Rails 5.1 的重點

  • Yarn 支援
  • 可選的 Webpack 支援
  • jQuery 不再是預設相依性
  • 系統測試
  • 加密密鑰
  • 參數化郵件器
  • 直接與解析路由
  • 將 form_for 和 form_tag 統一為 form_with

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

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-remotedata-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 中新增了兩個新方法 resolvedirectresolve 方法允許自訂模型的 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:updaterails:templaterails:template:copyrails:update:configsrails: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::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 重要變更

  • 在路由 DSL 中新增了 directresolve 方法。(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_fielddatetime_field_tag 以產生 datetime-local 欄位。(Pull Request

  • HTML 標籤的新建構器樣式語法 (tag.divtag.br 等)。(Pull Request

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

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

  • 移除將欄位傳遞給 #quote 的已棄用支援。(Commit

  • #tables 中移除已棄用的 name 引數。(Commit

  • 移除 #tables#table_exists? 的已棄用行為,使其返回表格和檢視,現在只返回表格而不返回檢視。(Commit

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

  • traveltravel_to 方法現在在巢狀呼叫時會引發錯誤。( Pull Request)

  • 更新 DateTime#change 以支援 usec (微秒) 和 nsec (奈秒)。( Pull Request)

13 個貢獻者

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



返回頂部