edge
更多資訊請參考 rubyonrails.org: 更多 Ruby on Rails

Ruby on Rails 5.0 發行說明

Rails 5.0 的亮點:

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

1 升級到 Rails 5.0

如果您正在升級現有應用程序,建議在進行升級之前進行良好的測試覆蓋。如果您尚未進行升級,請先升級到 Rails 4.2,並確保應用程序運行正常,然後再嘗試升級到 Rails 5.0。在升級時要注意的事項列表可在升級 Ruby on Rails指南中找到。

2 主要功能

2.1 Action Cable

Action Cable 是 Rails 5 中的新框架。它將 WebSockets 與您的 Rails 應用程序的其他部分無縫集成。

Action Cable 允許使用 Ruby 以與您的 Rails 應用程序的其他部分相同的風格和形式編寫實時功能,同時保持高效和可擴展性。它是一個全棧解決方案,提供了客戶端 JavaScript 框架和服務器端 Ruby 框架。您可以訪問使用 Active Record 或您選擇的 ORM 編寫的完整域模型。

有關更多信息,請參閱Action Cable 概述指南。

2.2 API 應用程序

Rails 現在可以用於創建精簡的僅限 API 應用程序。這對於創建和提供類似於 TwitterGitHub API 的公共面向和自定義應用程序非常有用。

您可以使用以下命令生成新的 API Rails 應用程序:

$ rails new my_api --api

這將執行三個主要操作:

  • 配置應用程序以使用比正常情況下更有限的中間件集。具體而言,默認情況下,它不會包含任何主要用於瀏覽器應用程序(例如 cookie 支持)的中間件。
  • 使 ApplicationController 繼承自 ActionController::API 而不是 ActionController::Base。與中間件一樣,這將省略任何主要用於瀏覽器應用程序的 Action Controller 模塊。
  • 配置生成器,在生成新資源時跳過生成視圖、幫助程序和資源。

該應用程序提供了一個用於 API 的基礎,然後可以根據應用程序的需求配置以引入功能。 請參閱僅使用Rails進行API應用程式指南以獲取更多資訊。

2.3 Active Record屬性API

在模型上定義具有類型的屬性。如果需要,它將覆蓋現有屬性的類型。 這允許控制在分配給模型時如何將值轉換為SQL以及從SQL轉換為值。 它還改變了傳遞給ActiveRecord::Base.where的值的行為,這讓我們可以在Active Record的大部分中使用我們的領域對象,而不必依賴於實現細節或猴子補丁。

以下是一些您可以通過這種方式實現的功能:

  • 可以覆蓋Active Record檢測到的類型。
  • 也可以提供默認值。
  • 屬性不需要有資料庫列支持。
# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end
store_listing = StoreListing.new(price_in_cents: '10.1')

# before
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, :integer # 自訂類型
  attribute :my_string, :string, default: "new default" # 默認值
  attribute :my_default_proc, :datetime, default: -> { Time.now } # 默認值
  attribute :field_without_db_column, :integer, array: true
end

# after
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # => {field_without_db_column: [1, 2, 3]}

創建自定義類型:

您可以定義自己的自定義類型,只要它們響應於值類型上定義的方法。方法deserializecast將在您的類型物件上調用,並使用來自資料庫或控制器的原始輸入。這在進行自定義轉換(例如貨幣數據)時非常有用。

查詢:

當調用ActiveRecord::Base.where時,它將使用模型類定義的類型將值轉換為SQL,並在您的類型物件上調用serialize

這使得對象能夠指定在執行SQL查詢時如何轉換值。

Dirty Tracking:

屬性的類型允許更改骯髒跟踪的方式。

請參閱其文檔進行詳細說明。

2.4 測試運行器

引入了一個新的測試運行器來增強從Rails運行測試的功能。 要使用此測試運行器,只需輸入bin/rails test

測試運行器受到RSpecminitest-reportersmaxitest和其他工具的啟發。 它包括以下一些值得注意的改進:

  • 使用測試的行號運行單個測試。
  • 使用測試的行號運行多個測試。
  • 改進的失敗消息,還可以輕鬆重新運行失敗的測試。
  • 使用-f選項快速失敗,即在發生失敗時立即停止測試,而不是等待套件完成。
  • 使用-d選項將測試輸出推遲到完整測試運行的結束。
  • 使用-b選項完整的異常回溯輸出。
  • 與minitest集成,允許選項如-s用於測試種子數據,-n用於按名稱運行特定測試,-v用於更好的詳細輸出等等。
  • 彩色測試輸出。 Railties --------

請參考更新日誌以獲取詳細的變更內容。

2.5 刪除項目

  • 刪除了除錯器支援,請改用byebug。Ruby 2.2不支援debugger。 (commit)

  • 刪除了已棄用的test:alltest:all:db任務。 (commit)

  • 刪除了已棄用的Rails::Rack::LogTailer。 (commit)

  • 刪除了已棄用的RAILS_CACHE常數。 (commit)

  • 刪除了已棄用的serve_static_assets設定。 (commit)

  • 刪除了文件任務doc:appdoc:railsdoc:guides。 (commit)

  • 從預設堆疊中刪除了Rack::ContentLength中介軟體。 (Commit)

2.6 已棄用項目

  • 已棄用config.static_cache_control,改用config.public_file_server.headers。 (Pull Request)

  • 已棄用config.serve_static_files,改用config.public_file_server.enabled。 (Pull Request)

  • 已棄用rails任務命名空間中的任務,改用app命名空間。 (例如,rails:updaterails:template任務改名為app:updateapp:template。) (Pull Request)

2.7 重要變更

  • 新增了Rails測試運行器bin/rails test。 (Pull Request)

  • 新生成的應用程式和插件在Markdown中獲得了一個README.md。 (commit, Pull Request)

  • 新增了bin/rails restart任務,通過觸發tmp/restart.txt來重新啟動Rails應用程式。 (Pull Request)

  • 新增了bin/rails initializers任務,按照Rails調用它們的順序列印出所有已定義的初始化器。 (Pull Request)

  • 新增了bin/rails dev:cache,用於在開發模式下啟用或禁用快取。 (Pull Request)

  • 新增了bin/update腳本,用於自動更新開發環境。 (Pull Request)

  • 通過bin/rails代理Rake任務。 (Pull Request, Pull Request)

  • 在Linux和macOS上啟用了新生成的應用程式的事件驅動文件系統監視器。可以通過在生成器中傳遞--skip-listen來選擇不使用此功能。 (commit, commit)

  • 生成的應用程式可以選擇使用環境變數RAILS_LOG_TO_STDOUT在生產環境中將日誌輸出到STDOUT。 (Pull Request)

  • 為新生成的應用程式啟用了具有IncludeSubdomains標頭的HSTS。 (Pull Request)

  • 應用程式生成器寫入了一個新文件config/spring.rb,告訴Spring監視其他常見文件。 (commit)

  • 在生成新應用程式時,新增了--skip-action-mailer選項,用於跳過Action Mailer。 (Pull Request)

  • 刪除了tmp/sessions目錄及相關的清理Rake任務。 (Pull Request)

  • 修改了由脚手架生成的_form.html.erb,使用本地變數。 (Pull Request)

  • 在生產環境中禁用了類的自動載入。 (commit)

3 Action Pack

請參考更新日誌以獲取詳細的變更內容。

3.1 刪除項目

  • 刪除了ActionDispatch::Request::Utils.deep_munge。 (commit)

  • 刪除了ActionController::HideActions。 (Pull Request)

  • 刪除了respond_torespond_with的占位方法,此功能已提取到responders gem中。 (commit)

  • 刪除了已棄用的斷言文件。 (commit)

  • 刪除了URL輔助方法中使用字符串鍵的已棄用用法。 (commit)

  • 刪除了*_path輔助方法中已棄用的only_path選項。 (commit)

  • 移除了已棄用的NamedRouteCollection#helpers。 (commit)

  • 移除了不再支援使用不包含#to選項定義路由的功能。 (commit)

  • 移除了已棄用的ActionDispatch::Response#to_ary。 (commit)

  • 移除了已棄用的ActionDispatch::Request#deep_munge。 (commit)

  • 移除了已棄用的ActionDispatch::Http::Parameters#symbolized_path_parameters。 (commit)

  • 移除了控制器測試中已棄用的use_route選項。 (commit)

  • 移除了assignsassert_template。這兩個方法已經被提取到rails-controller-testing gem中。 (Pull Request)

3.2 已棄用功能

  • 已棄用所有*_filter回調,改用*_action回調。 (Pull Request)

  • 已棄用*_via_redirect整合測試方法。在請求調用後手動使用follow_redirect!達到相同效果。 (Pull Request)

  • 已棄用AbstractController#skip_action_callback,改用個別的skip_callback方法。 (Pull Request)

  • 已棄用render方法的:nothing選項。 (Pull Request)

  • 已棄用將第一個參數作為Hashhead方法的預設狀態碼的功能。 (Pull Request)

  • 已棄用使用字符串或符號作為中介軟體類名的功能。請改用類名。 (commit)

  • 已棄用通過常量(例如Mime::HTML)訪問MIME類型的功能。請改用使用符號的下標運算符(例如Mime[:html])。 (Pull Request)

  • 已棄用redirect_to :back,改用redirect_back,該方法接受必需的fallback_location參數,從而消除了RedirectBackError的可能性。 (Pull Request)

  • ActionDispatch::IntegrationTestActionController::TestCase已棄用位置參數,改用關鍵字參數。 (Pull Request)

  • 已棄用controlleraction路徑參數。 (Pull Request)

  • 已棄用控制器實例上的env方法。 (commit)

  • ActionDispatch::ParamsParser已棄用並從中介軟體堆棧中移除。要配置參數解析器,請使用ActionDispatch::Request.parameter_parsers=。 (commit, commit)

3.3 重要變更

  • 添加了ActionController::Renderer,用於在控制器動作之外渲染任意模板。 (Pull Request)

  • ActionController::TestCaseActionDispatch::Integration的HTTP請求方法中遷移為關鍵字參數語法。 (Pull Request)

  • 添加了http_cache_forever到Action Controller,以便可以緩存永不過期的響應。 (Pull Request)

  • 提供更友好的訪問請求變體的方式。 (Pull Request)

  • 對於沒有對應模板的動作,渲染head :no_content而不是拋出錯誤。 (Pull Request)

  • 添加了在控制器中覆蓋默認表單生成器的能力。 (Pull Request)

  • 添加了對僅API應用的支援。ActionController::API被添加作為這種應用的ActionController::Base的替代品。 (Pull Request)

  • ActionController::Parameters不再繼承自HashWithIndifferentAccess,使其更容易使用。 (Pull Request)

  • 通過使其更安全且更容易禁用,使得更容易選擇啟用config.force_sslconfig.ssl_options。 (Pull Request)

  • 添加了將任意標頭返回給ActionDispatch::Static的能力。 (Pull Request)

  • protect_from_forgery的預設prepend改為false。 (commit)

  • ActionController::TestCase 在 Rails 5.1 中將被移至自己的 gem 中。請改用 ActionDispatch::IntegrationTest。 (commit)

  • Rails 默認生成弱 ETags。 (Pull Request)

  • 控制器動作如果沒有顯式的 render 調用且沒有對應的模板,將隱式地渲染 head :no_content 而不是拋出錯誤。 (Pull Request 1, 2)

  • 增加了每個表單的 CSRF token 選項。 (Pull Request)

  • 在集成測試中增加了請求編碼和響應解析。 (Pull Request)

  • 添加 ActionController#helpers 以在控制器層級獲取視圖上下文。 (Pull Request)

  • 棄用的 flash 訊息在存入 session 前被刪除。 (Pull Request)

  • 支持將記錄集合傳遞給 fresh_whenstale?。 (Pull Request)

  • ActionController::Live 變成了 ActiveSupport::Concern。這意味著它不能只被包含在其他模塊中,而不擴展它們使用 ActiveSupport::ConcernActionController::Live,否則在生產環境中 ActionController::Live 將不會生效。有些人可能還使用另一個模塊來包含一些特殊的 Warden/Devise 認證失敗處理代碼,因為中間件無法捕獲由使用 ActionController::Live 時生成的線程拋出的 :warden。 (更多詳情請參見此問題)

  • 引入了 Response#strong_etag=#weak_etag=,以及 fresh_whenstale? 的相應選項。 (Pull Request)

4 Action View

詳細更改請參見 Changelog

4.1 刪除

  • 刪除了棄用的 AbstractController::Base::parent_prefixes。 (commit)

  • 刪除了 ActionView::Helpers::RecordTagHelper,此功能已提取到 record_tag_helper gem 中。 (Pull Request)

  • 刪除了 :rescue_format 選項的 translate 輔助方法,因為它不再被 I18n 支持。 (Pull Request)

4.2 重要更改

  • 將默認模板處理程序從 ERB 改為 Raw。 (commit)

  • 集合渲染可以緩存並一次獲取多個局部模板。 (Pull Request, commit)

  • 對於明確的依賴項,添加了通配符匹配。 (Pull Request)

  • disable_with 設置為提交標籤的默認行為。在提交時禁用按鈕以防止重複提交。 (Pull Request)

  • 局部模板名稱不再需要是有效的 Ruby 識別符。 (commit)

  • datetime_tag 輔助方法現在生成一個類型為 datetime-local 的輸入標籤。 (Pull Request)

  • 在使用 render partial: 輔助方法時允許使用區塊。 (Pull Request)

5 Action Mailer

詳細更改請參見 Changelog

5.1 刪除

  • 刪除了在電子郵件視圖中的棄用的 *_path 輔助方法。 (commit)

  • 刪除了棄用的 deliverdeliver! 方法。 (commit)

5.2 重要更改

  • 模板查找現在尊重默認語言和 I18n 回退。 (commit)

  • 通過生成器創建的郵件發送器現在在名稱上添加 _mailer 後綴,遵循與控制器和作業相同的命名慣例。 (Pull Request)

  • 新增了 assert_enqueued_emailsassert_no_enqueued_emails 方法。 (Pull Request)

  • 新增了 config.action_mailer.deliver_later_queue_name 配置,用於設置郵件發送隊列的名稱。 (Pull Request)

  • 在 Action Mailer 視圖中新增了對片段緩存的支持。 新增了新的配置選項 config.action_mailer.perform_caching,用於確定模板是否應該進行緩存。 (Pull Request)

6 Active Record

詳細的變更請參考 Changelog

6.1 刪除

  • 刪除了允許嵌套數組作為查詢值的已棄用行為。 (Pull Request)

  • 刪除了已棄用的 ActiveRecord::Tasks::DatabaseTasks#load_schema 方法。 這個方法已被 ActiveRecord::Tasks::DatabaseTasks#load_schema_for 方法取代。 (commit)

  • 刪除了已棄用的 serialized_attributes 方法。 (commit)

  • 刪除了已棄用的 has_many :through 上的自動計數緩存。 (commit)

  • 刪除了已棄用的 sanitize_sql_hash_for_conditions 方法。 (commit)

  • 刪除了已棄用的 Reflection#source_macro 方法。 (commit)

  • 刪除了已棄用的 symbolized_base_classsymbolized_sti_name 方法。 (commit)

  • 刪除了已棄用的 ActiveRecord::Base.disable_implicit_join_references= 方法。 (commit)

  • 刪除了使用字符串訪問器訪問連接配置的已棄用支持。 (commit)

  • 刪除了預加載實例相關聯的已棄用支持。 (commit)

  • 刪除了對於具有獨占下界的 PostgreSQL 範圍的已棄用支持。 (commit)

  • 刪除了使用緩存的 Arel 修改關聯的已棄用支持。 現在會引發 ImmutableRelation 錯誤。 (commit)

  • 從核心中刪除了 ActiveRecord::Serialization::XmlSerializer。這個功能已經被提取到 activemodel-serializers-xml gem 中。 (Pull Request)

  • 從核心中刪除了對於舊版 mysql 數據庫適配器的支持。大多數用戶應該可以使用 mysql2。 當我們找到有人維護它時,它將被轉換為一個獨立的 gem。 (Pull Request 1, Pull Request 2)

  • 刪除了對於 protected_attributes gem 的支持。 (commit)

  • 刪除了對於低於 9.1 版本的 PostgreSQL 的支持。 (Pull Request)

  • 刪除了對於 activerecord-deprecated_finders gem 的支持。 (commit)

  • 刪除了 ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES 常量。 (commit)

6.2 已棄用

  • 已棄用將類作為查詢值的方式。用戶應該使用字符串代替。 (Pull Request)

  • 已棄用將 false 作為停止 Active Record 回調鏈的方式。推薦的方式是使用 throw(:abort)。 (Pull Request)

  • 已棄用 ActiveRecord::Base.errors_in_transactional_callbacks=。 (commit)

  • 已棄用 Relation#uniq,請改用 Relation#distinct。 (commit)

  • 已棄用 PostgreSQL 的 :point 類型,改用一個新的類型,將返回 Point 對象而不是 Array (Pull Request)

  • 已棄用通過將真值參數傳遞給關聯方法來強制重新加載關聯。 (Pull Request)

  • 已棄用關聯 restrict_dependent_destroy 錯誤的鍵名,改用新的鍵名。 (Pull Request)

  • 同步 #tables 的行為。 (Pull Request)

  • 已棄用 SchemaCache#tablesSchemaCache#table_exists?SchemaCache#clear_table_cache!,改用它們的新數據源對應方法。 (Pull Request)

  • 已棄用 SQLite3 和 MySQL 适配器上的 connection.tables。 (Pull Request)

  • 已棄用將參數傳遞給 #tables - 一些适配器(mysql2、sqlite3)的 #tables 方法會返回表和視圖, 而其他适配器(postgresql)只返回表。為了使它們的行為一致,#tables 將來只返回表。 (Pull Request)

  • 廢棄 table_exists? - #table_exists? 方法將同時檢查表格和視圖。為了使其行為與 #tables 一致,#table_exists? 在未來將僅檢查表格。 (拉取請求)

  • 廢棄將 offset 參數傳遞給 find_nth。請改用關聯上的 offset 方法。 (拉取請求)

  • 廢棄 DatabaseStatements 中的 {insert|update|delete}_sql。請改用相應的公共方法 {insert|update|delete}。 (拉取請求)

  • 廢棄 use_transactional_fixtures,建議改用 use_transactional_tests 以增加清晰度。 (拉取請求)

  • 廢棄將列傳遞給 ActiveRecord::Connection#quote。 (提交)

  • find_in_batches 中新增了一個 end 選項,用於指定批次處理的結束位置。 (拉取請求)

6.3 重要變更

  • 在創建表格時,references 新增了一個 foreign_key 選項。 (提交)

  • 新增了屬性 API。 (提交)

  • enum 定義中新增了 :_prefix/:_suffix 選項。 (拉取請求, 拉取請求)

  • ActiveRecord::Relation 中新增了 #cache_key 方法。 (拉取請求)

  • timestamps 的預設 null 值更改為 false。 (提交)

  • 新增了 ActiveRecord::SecureToken,用於封裝使用 SecureRandom 在模型中生成唯一標記的功能。 (拉取請求)

  • drop_table 新增了 :if_exists 選項。 (拉取請求)

  • 新增了 ActiveRecord::Base#accessed_fields,可用於快速查找從模型讀取的字段,以便只選擇所需的數據。 (提交)

  • ActiveRecord::Relation 上新增了 #or 方法,允許使用 OR 運算符組合 WHERE 或 HAVING 子句。 (提交)

  • 新增了 ActiveRecord::Base.suppress,用於在給定的區塊中阻止接收器被保存。 (拉取請求)

  • belongs_to 現在默認情況下,如果關聯不存在,將觸發驗證錯誤。您可以使用 optional: true 在每個關聯上關閉此功能。同時廢棄 required 選項,建議改用 optional。 (拉取請求)

  • 新增了 config.active_record.dump_schemas 以配置 db:structure:dump 的行為。 (拉取請求)

  • 新增了 config.active_record.warn_on_records_fetched_greater_than 選項。 (拉取請求)

  • 在 MySQL 中新增了對原生 JSON 數據類型的支持。 (拉取請求)

  • 在 PostgreSQL 中新增了同時刪除索引的支持。 (拉取請求)

  • 在連接適配器上新增了 #views#view_exists? 方法。 (拉取請求)

  • 新增了 ActiveRecord::Base.ignored_columns,用於使某些列在 Active Record 中不可見。 (拉取請求)

  • 新增了 connection.data_sourcesconnection.data_source_exists?。這些方法確定可以用於支持 Active Record 模型的關聯(通常是表格和視圖)。 (拉取請求)

  • 允許夾具文件在 YAML 文件本身中設置模型類。 (拉取請求)

  • 在生成數據庫遷移時,新增了默認使用 uuid 作為主鍵的能力。 (拉取請求)

  • 新增了 ActiveRecord::Relation#left_joinsActiveRecord::Relation#left_outer_joins 方法。 (Pull Request)

  • 新增了 after_{create,update,delete}_commit 回調函數。 (Pull Request)

  • 對遷移類別呈現的 API 進行版本控制,這樣我們就可以更改參數默認值而不會破壞現有的遷移,也不會強制通過棄用週期來重寫它們。 (Pull Request)

  • ApplicationRecord 是所有應用模型的新超類,類似於應用控制器繼承 ApplicationController 而不是 ActionController::Base。這為應用程序提供了一個單一的地方來配置應用程序範圍的模型行為。 (Pull Request)

  • 新增了 ActiveRecord 的 #second_to_last#third_to_last 方法。 (Pull Request)

  • 為 PostgreSQL 和 MySQL 新增了對數據庫對象(表、列、索引)的註釋功能,註釋存儲在數據庫元數據中。 (Pull Request)

  • mysql2 适配器添加了預編譯語句支持,適用於 mysql2 0.4.4+,之前僅支持已棄用的 mysql 遺留适配器。要啟用此功能,請在 config/database.yml 中設置 prepared_statements: true。 (Pull Request)

  • 新增了對關聯對象調用 ActionRecord::Relation#update 的能力,這將在關聯中的所有對象上運行驗證和回調。 (Pull Request)

  • save 方法添加了 :touch 選項,以便可以在保存記錄時不更新時間戳。 (Pull Request)

  • 為 PostgreSQL 添加了表達式索引和運算符類支持。 (commit)

  • 為嵌套屬性的錯誤添加了 :index_errors 選項。 (Pull Request)

  • 支持雙向銷毀依賴。 (Pull Request)

  • 在事務測試中添加了對 after_commit 回調的支持。 (Pull Request)

  • 添加了 foreign_key_exists? 方法,用於查看表上是否存在外鍵。 (Pull Request)

  • touch 方法添加了 :time 選項,以便可以使用不同的時間觸發記錄的觸發。 (Pull Request)

  • 更改事務回調,不再吞噬錯誤。在此更改之前,事務回調中引發的任何錯誤都會被捕獲並打印在日誌中,除非使用(新棄用的)raise_in_transactional_callbacks = true 選項。

    現在這些錯誤不再被捕獲,而是直接上升,與其他回調的行為一致。 (commit)

7 Active Model

詳細更改請參閱 Changelog

7.1 刪除

7.2 棄用

  • 棄用了將 false 作為停止 Active Model 和 ActiveModel::Validations 回調鏈的方法。建議使用 throw(:abort)。 (Pull Request)

  • 棄用了具有不一致行為的 ActiveModel::Errors#getActiveModel::Errors#setActiveModel::Errors#[]= 方法。 (Pull Request)

  • 棄用了 validates_length_of:tokenizer 選項,改用純 Ruby。 (Pull Request)

  • 停用了ActiveModel::Errors#add_on_emptyActiveModel::Errors#add_on_blank,没有替代方法。 (Pull Request)

7.3 重要更改

  • 添加了ActiveModel::Errors#details以确定哪个验证器失败。 (Pull Request)

  • ActiveRecord::AttributeAssignment提取到ActiveModel::AttributeAssignment中,允许将其作为可包含模块用于任何对象。 (Pull Request)

  • 添加了ActiveModel::Dirty#[attr_name]_previously_changed?ActiveModel::Dirty#[attr_name]_previous_change,以改进在模型保存后访问记录的更改。 (Pull Request)

  • valid?invalid?上同时验证多个上下文。 (Pull Request)

  • validates_acceptance_of的默认值从1更改为接受true。 (Pull Request)

8 Active Job

请参考Changelog以获取详细更改信息。

8.1 重要更改

  • ActiveJob::Base.deserialize委托给作业类。这允许作业在序列化时附加任意元数据,并在执行时读取回来。 (Pull Request)

  • 添加了按作业基础配置队列适配器的能力,而不会相互影响。 (Pull Request)

  • 生成的作业现在默认继承自app/jobs/application_job.rb。 (Pull Request)

  • 允许DelayedJobSidekiqququequeue_classic将作业ID作为provider_job_id返回给ActiveJob::Base。 (Pull Request, Pull Request, commit)

  • 实现了一个简单的AsyncJob处理器和相关的AsyncAdapter,将作业排队到concurrent-ruby线程池中。 (Pull Request)

  • 将默认适配器从内联更改为异步。这是一个更好的默认值,因为测试将不会错误地依赖于同步发生的行为。 (commit)

9 Active Support

请参考Changelog以获取详细更改信息。

9.1 移除

  • 移除了已弃用的ActiveSupport::JSON::Encoding::CircularReferenceError。 (commit)

  • 移除了已弃用的方法ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=ActiveSupport::JSON::Encoding.encode_big_decimal_as_string。 (commit)

  • 移除了已弃用的ActiveSupport::SafeBuffer#prepend。 (commit)

  • 移除了Kernel中的已弃用方法。使用silence_stderrsilence_streamcapturequietly。 (commit)

  • 移除了已弃用的active_support/core_ext/big_decimal/yaml_conversions文件。 (commit)

  • 移除了已弃用的方法ActiveSupport::Cache::Store.instrumentActiveSupport::Cache::Store.instrument=。 (commit)

  • 移除了已弃用的Class#superclass_delegating_accessor。使用Class#class_attribute代替。 (Pull Request)

  • 移除了已弃用的ThreadSafe::Cache。使用Concurrent::Map代替。 (Pull Request)

  • 移除了Object#itself,因为它在Ruby 2.2中已实现。 (Pull Request)

9.2 弃用

  • 弃用MissingSourceFile,使用LoadError代替。 (commit)

  • 弃用alias_method_chain,使用Ruby 2.0引入的Module#prepend代替。 (Pull Request)

  • 弃用ActiveSupport::Concurrency::Latch,使用来自concurrent-ruby的Concurrent::CountDownLatch。 (Pull Request)

  • 弃用number_to_human_sizeprefix选项,没有替代方法。 (Pull Request)

  • 弃用Module#qualified_const_,使用内置的Module#const_方法。 (Pull Request)

  • 弃用传递字符串来定义回调。 (Pull Request)

  • 弃用ActiveSupport::Cache::Store#namespaced_keyActiveSupport::Cache::MemCachedStore#escape_keyActiveSupport::Cache::FileStore#key_file_path。使用normalize_key代替。 (Pull Request, commit)

  • 弃用ActiveSupport::Cache::LocaleCache#set_cache_value,使用write_cache_value。 (Pull Request)

  • 不推薦將參數傳遞給 assert_nothing_raised。 (Pull Request)

  • 不推薦使用 Module.local_constants,建議改用 Module.constants(false)。 (Pull Request)

9.3 重要變更

  • ActiveSupport::MessageVerifier 中新增了 #verified#valid_message? 方法。 (Pull Request)

  • 改變了回呼鏈的停止方式。從現在開始,停止回呼鏈的首選方法是明確地使用 throw(:abort)。 (Pull Request)

  • 新增了配置選項 config.active_support.halt_callback_chains_on_return_false,用於指定是否可以通過在 'before' 回呼中返回 false 來停止 ActiveRecord、ActiveModel 和 ActiveModel::Validations 的回呼鏈。 (Pull Request)

  • 將預設的測試順序從 :sorted 改為 :random。 (commit)

  • DateTimeDateTime 中新增了 #on_weekend?#on_weekday?#next_weekday#prev_weekday 方法。 (Pull Request, Pull Request)

  • DateTimeDateTime 中的 #next_week#prev_week 新增了 same_time 選項。 (Pull Request)

  • DateTimeDateTime 中新增了 #prev_day#next_day 方法,作為 #yesterday#tomorrow 的對應方法。 (Pull Request)

  • 新增了 SecureRandom.base58,用於生成隨機的 base58 字串。 (commit)

  • ActiveSupport::TestCase 中新增了 file_fixture。它提供了一個簡單的機制,在測試案例中訪問樣本文件。 (Pull Request)

  • EnumerableArray 上新增了 #without 方法,用於返回不包含指定元素的可枚舉對象的副本。 (Pull Request)

  • 新增了 ActiveSupport::ArrayInquirerArray#inquiry。 (Pull Request)

  • 新增了 ActiveSupport::TimeZone#strptime,允許按照指定時區解析時間。 (commit)

  • Integer 中新增了 #positive?#negative? 查詢方法,類似於 #zero?。 (commit)

  • ActiveSupport::OrderedOptions 的 get 方法中新增了驚嘆號版本,如果值為 .blank?,則會引發 KeyError。 (Pull Request)

  • 新增了 Time.days_in_year,返回指定年份的天數,如果沒有提供參數,則返回當前年份的天數。 (commit)

  • 新增了一個事件驅動的文件監視器,用於異步檢測應用程式源代碼、路由、本地化等的變化。 (Pull Request)

  • 為聲明每個線程獨立的類和模塊變量,新增了 thread_m/cattr_accessor/reader/writer 一系列方法。 (Pull Request)

  • Array 中新增了 #second_to_last#third_to_last 方法。 (Pull Request)

  • 公開了 ActiveSupport::ExecutorActiveSupport::Reloader 的 API,允許組件和庫管理和參與應用程式代碼的執行和應用程式重新加載過程。 (Pull Request)

  • ActiveSupport::Duration 現在支援 ISO8601 格式化和解析。 (Pull Request)

  • 當啟用 parse_json_times 時,ActiveSupport::JSON.decode 現在支援解析 ISO8601 本地時間。 (Pull Request)

  • ActiveSupport::JSON.decode 現在會返回 Date 對象,而不是日期字符串。 (Pull Request)

  • TaggedLogging 中新增了能夠多次實例化記錄器的功能,以便它們不共享標籤。 (Pull Request)

    貢獻者

請參閱Rails的完整貢獻者清單,感謝所有花費許多時間打造Rails這個穩定且強大框架的人們。向他們致敬。

回饋

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

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

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

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

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