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-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} 邀請您加入他們的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、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:update
、rails:template
、rails:template:copy
、rails:update:configs
和rails: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::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
詳細變更請參閱 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_field
和datetime_field_tag
更改為生成datetime-local
欄位。 (Pull Request)HTML 標籤的新 Builder-style 語法(
tag.div
、tag.br
等)。 (Pull Request)添加
form_with
以統一form_tag
和form_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.one
和activerecord.errors.messages.restrict_dependent_destroy.many
的i18n範圍。 (Commit)移除了單數和集合關聯讀取器中已棄用的force-reload參數。 (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)使用
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_on
和ActiveJob::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_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成為穩定和強大框架的人。向他們致敬。
回饋
歡迎協助提升本指南的品質。
如果您發現任何錯別字或事實錯誤,請貢獻您的力量。 開始之前,您可以閱讀我們的 文件貢獻 部分。
您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。
如果您發現需要修復但無法自行修補的問題,請 開啟一個問題。
最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。