edge
更多資訊請參考 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

拉取請求

Rails 5.1 允許通過 Yarn 管理 npm 的 JavaScript 相依性。這將使使用 React、VueJS 或其他 npm 世界的庫變得容易。Yarn 支援與資產管線集成,以便所有相依性都能與 Rails 5.1 應用程式無縫運作。

2.2 可選擇支援 Webpack

拉取請求

Rails 應用程式可以更輕鬆地與 JavaScript 資產捆綁工具 Webpack 整合,使用新的 Webpacker 寶石。在生成新應用程式時,使用 --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} 邀請您加入他們的Basecamp(#{@account.name})"
  end
end
InvitationsMailer.with(inviter: person_a, invitee: person_b)
                 .account_invitation.deliver_later

2.7 直接和解析的路由

拉取請求

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、Hash、Array、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 %>

<%# 將生成 %>

<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 %>

<%# 將生成 %>

<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 %>

<%# 會生成以下內容 %>

<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 %>

<%# 會生成以下內容 %>

<form action="/posts/1" method="post" data-remote="true">
  <input type="hidden" name="_method" value="patch">
  <input type="text" name="post[title]" value="<文章的標題>">
</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)選項。 (Pull Request)

4.2 重要更改

  • config/secrets.yml中添加了一個共享部分,將在所有環境中加載。 (commit)

  • 現在使用符號作為所有鍵將config/secrets.yml配置文件加載。 (Pull Request)

  • 從默認堆棧中刪除jquery-rails。rails-ujs是Action View附帶的默認UJS適配器。 (Pull Request)

  • 在新應用程序中添加Yarn支持,包括yarn binstub和package.json。 (Pull Request)

  • 通過--webpack選項在新應用程序中添加Webpack支持,該選項將委派給rails/webpacker gem。 (Pull Request)

  • 在生成新應用程式時,如果沒有提供 --skip-git 選項,則初始化 Git 儲存庫。 (Pull Request)

  • config/secrets.yml.enc 中添加加密的密鑰。 (Pull Request)

  • rails initializers 中顯示 railtie 類別名稱。 (Pull Request)

5 Action Cable

詳細變更請參閱 Changelog

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 中的非關鍵字參數支援。 (Commit, Commit)

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

  • 移除已棄用的與控制器過濾器相關的方法。 (Commit)

  • 移除在 render 中對 :text:nothing 的支援。 (Commit, Commit)

  • 移除在 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

詳細變更請參閱 Changelog

7.1 刪除項目

  • 移除 ActionView::Template::Error 中的已棄用 #original_exception。 (commit)

  • strip_tags 中移除名稱錯誤的 encode_special_chars 選項。 (Pull Request)

7.2 已棄用項目

  • 已棄用 Erubis ERB 處理器,改用 Erubi。 (Pull Request)

7.3 重要變更

  • Raw 樣板處理器(Rails 5 中的預設樣板處理器)現在輸出 HTML 安全字串。 (commit)

  • datetime_fielddatetime_field_tag 更改為生成 datetime-local 欄位。 (Pull Request)

  • HTML 標籤的新 Builder-style 語法(tag.divtag.br 等)。 (Pull Request)

  • 添加 form_with 以統一 form_tagform_for 的用法。 (Pull Request)

  • current_page? 中添加 check_parameters 選項。 (Pull Request)

8 Action Mailer

詳細變更請參閱 Changelog

8.1 重要變更

  • 允許在包含附件並設置內容為內嵌的情況下設置自定義內容類型。 (Pull Request)

  • 允許將 lambda 函式作為 default 方法的值。 (Commit)

  • 添加對郵件的參數化調用支援,以在不同的郵件動作之間共享前置過濾器和默認值。 (Commit)

  • process.action_mailer 事件中將傳入的引數傳遞給郵件動作,並以 args 鍵的形式傳遞。 (Pull Request)

9 Active Record

詳細變更請參閱 Changelog

9.1 刪除項目

  • 移除了將參數和區塊同時傳遞給ActiveRecord::QueryMethods#select的支援。 (Commit)

  • 移除了已棄用的activerecord.errors.messages.restrict_dependent_destroy.oneactiverecord.errors.messages.restrict_dependent_destroy.many的i18n範圍。 (Commit)

  • 移除了單數和集合關聯讀取器中已棄用的force-reload參數。 (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)

  • 使用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

詳細更改請參閱更新日誌

10.1 移除

  • 移除了ActiveModel::Errors中的已棄用方法。 (commit)

  • 移除了長度驗證器中已棄用的:tokenizer選項。 (commit)

  • 移除了當返回值為false時中止回調的已棄用行為。 (commit)

10.2 重要更改

  • 不再錯誤地凍結分配給模型屬性的原始字符串。 (Pull Request)

11 主動工作

詳細更改請參閱變更日誌

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 主動支援

詳細更改請參閱變更日誌

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成為穩定和強大框架的人。向他們致敬。

回饋

歡迎協助提升本指南的品質。

如果您發現任何錯別字或事實錯誤,請貢獻您的力量。 開始之前,您可以閱讀我們的 文件貢獻 部分。

您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。

如果您發現需要修復但無法自行修補的問題,請 開啟一個問題

最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。