Ruby on Rails 7.1 リリースノート

Rails 7.1 の注目ポイント:

  • 新規RailsアプリケーションでDockerfilesを生成するようになった
  • ActiveRecord::Base.normalizesを追加
  • ActiveRecord::Base.generates_token_forを追加
  • 複数ジョブを一括エンキューするperform_all_later
  • 複合主キー
  • Trilogy用アダプタの導入
  • ActiveSupport::MessagePackを追加
  • config.autoload_libconfig.autoload_lib_onceを追加(拡張オートローディング用)
  • 汎用の非同期クエリ用Active Record API
  • ビューテンプレートに厳密なlocalsを設定可能になった
  • Rails.application.deprecatorsを追加
  • JSON response.parsed_bodyのパターンマッチングをサポート
  • response.parsed_bodyを拡張してHTMLをNokogiriでパース可能になった
  • ActionView::TestCase.register_parserを導入

本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストを参照してください。

目次

  1. Rails 7.1にアップグレードする
  2. 主要な機能
  3. Railties
  4. Action Cable
  5. Action Pack
  6. Action View
  7. Action Mailer
  8. Active Record
  9. Active Storage
  10. Active Model
  11. Active Support
  12. Active Job
  13. Action Text
  14. Action Mailbox
  15. Ruby on Railsガイド
  16. Credits

1 Rails 7.1にアップグレードする

既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 7.0までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 7.1にアップデートしてください。アップグレードの注意点などについてはRailsアップグレードガイドを参照してください。

2 主要な機能

2.1 新規RailsアプリケーションでDockerfileが生成されるようになった

新規Railsアプリケーションでは、デフォルトでDockerがサポートされるようになりました(#46762)。 新しいアプリケーションを生成すると、そのアプリケーションにDocker関連ファイルも含まれます。

これらのファイルは、RailsアプリケーションをDockerでproduction環境にデプロイするための基本的なセットアップとして提供されます。重要なのは、これらのファイルは開発用ではないことです。

以下は、これらのDockerファイルでRailsアプリをビルドして実行する簡単な例です。

$ docker build -t app .
$ docker volume create app-storage
$ docker run --rm -it -v app-storage:/rails/storage -p 3000:3000 --env RAILS_MASTER_KEY=<your-config-master-key> app

Railsコンソールやランナーも、このDockerイメージから起動できます。

$ docker run --rm -it -v app-storage:/rails/storage --env RAILS_MASTER_KEY=<your-config-master-key> app console

マルチプラットフォーム向けイメージ(Apple SiliconをAMDやIntelデプロイするなど)を作成してDocker Hubにプッシュする方法を知りたい方は、以下の手順に沿ってください。

$ docker login -u <your-user>
$ docker buildx create --use
$ docker buildx build --push --platform=linux/amd64,linux/arm64 -t <your-user/image-name> .

この拡張によってデプロイプロセスがシンプルになるので、これを出発点としてRailsアプリケーションをproduction環境ですばやく立ち上げられるようにできます。

2.2 ActiveRecord::Base.normalizesが追加

ActiveRecord::Base.normalizesは属性値に対して正規化を宣言します(#43945)。正規化は、属性の代入や更新のタイミングで行われ、データベースで永続化されます。正規化はfinder系メソッドの対応するキーワード引数にも適用されるので、正規化されていない値でレコードをクエリできるようになります。

例:

class User < ActiveRecord::Base
  normalizes :email, with: -> email { email.strip.downcase }
  normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end

user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email                  # => "cruise-control@example.com"

user = User.find_by(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")
user.email                  # => "cruise-control@example.com"
user.email_before_type_cast # => "cruise-control@example.com"

User.where(email: "\tCRUISE-CONTROL@EXAMPLE.COM ").count         # => 1
User.where(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0

User.exists?(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")         # => true
User.exists?(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]) # => false

User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"

2.3 ActiveRecord::Base.generates_token_forが追加

ActiveRecord::Base.generates_token_forは特定の目的で利用するトークンの生成を定義します(#44189)。生成されたトークンは失効させることも、レコードデータを埋め込むこともできます。トークンを用いてレコードを取得すると、トークンのデータと現在のレコードのデータが比較されます。両者が一致しない場合、トークンは無効とみなされ、期限切れとして扱われます。

単一利用の例として、パスワードリセットのトークンの実装を以下に示します。

class User < ActiveRecord::Base
  has_secure_password

  generates_token_for :password_reset, expires_in: 15.minutes do
    # `password_salt`(`has_secure_password`で定義される)は、
    # そのパスワードのsaltを返す。パスワードが変更されるとsaltも変更されるので、
    # パスワードが変更されるとこのトークンは無効になる。
    password_salt&.last(10)
  end
end

user = User.first
token = user.generate_token_for(:password_reset)

User.find_by_token_for(:password_reset, token) # => user

user.update!(password: "new password")
User.find_by_token_for(:password_reset, token) # => nil

2.4 大量のジョブを一度にエンキューするperform_all_laterが追加

Active Jobのperform_all_laterメソッドは、複数のジョブを同時にエンキューするプロセスを効率化するために設計されています(#46603)。この強力な追加機能により、コールバックをトリガーせずに効率的にジョブをエンキューできるようになります。これは特に複数ジョブを一括でエンキューする必要がある場合や、データがキューデータストアと何度も往復することによるオーバーヘッドを削減したい場合に便利です。

perform_all_laterの利用方法を以下に示します。

# 個別のジョブをエンキューする
ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))

# ジョブの配列をエンキューする
user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
ActiveJob.perform_all_later(user_jobs)

perform_all_laterを利用することで、ジョブのエンキュー処理を最適化し、特に大量のジョブを扱うときの効率が向上します。Sidekiqアダプタなど、新しいenqueue_allメソッドをサポートするキューアダプタでは、push_bulkを使うことでさらにエンキュー処理が最適化されます。

この新しいメソッドでは、既存のenqueue.active_jobイベントを使わず、別のenqueue_all.active_jobイベントが導入されます。これにより、一括エンキュー処理のトラッキングとレポートが精密に行われるようになります。

2.5 複合主キー

データベースとアプリケーションの両方で複合主キー(composite primary key)がサポートされるようになりました。Railsはスキーマからこれらのキーを直接導出できるようになります。この機能は、「多対多」リレーションシップや、その他の複雑なデータモデルで、単一カラムだけではレコードをうまく一意に識別できない場合に特に有用です。

Active Recordのクエリメソッドで生成されるSQL(#reload#update#deleteなど)には、複合主キーのすべての部分が含まれます。 #first#lastなどのメソッドでは、ORDER BYステートメントで複合主キー全体が使われます。

query_constraintsマクロは、データベーススキーマを変更せずに同じ振る舞いを実現するための「仮想主キー」として利用できます。

例:

class TravelRoute < ActiveRecord::Base
  query_constraints :origin, :destination
end

同様に、関連付けにもquery_constraints:オプションを渡せます。このオプションは、関連付けられるレコードにアクセスするのに使うカラムのリストを設定する「複合外部キー(composite foreign key)」として機能します。

例:

class TravelRouteReview < ActiveRecord::Base
  belongs_to :travel_route, query_constraints: [:travel_route_origin, :travel_route_destination]
end

2.6 Trilogy用のアダプタが導入

MySQL互換のデータベースクライアントであるTrilogyとRailsアプリケーションをシームレスに統合する新しいアダプターが導入されました(#47880)。これにより、Railsアプリケーションで以下のようにconfig/database.ymlファイルを設定することで、Trilogyの機能を取り込むオプションが提供されます。

development:
  adapter: trilogy
  database: blog_development
  pool: 5

または、以下のようにDATABASE_URL環境変数で統合することも可能です。

ENV['DATABASE_URL'] # => "trilogy://localhost/blog_development?pool=5"

2.7 ActiveSupport::MessagePackが追加

ActiveSupport::MessagePackは、msgpack gemと統合されたシリアライザです(#47770)。ActiveSupport::MessagePackは、msgpackでサポートされている基本的なRubyの型に加えて、TimeActiveSupport::TimeWithZoneActiveSupport::HashWithIndifferentAccessなどの追加の型もシリアライズできます。ActiveSupport::MessagePackは、JSONMarshalに比べてペイロードサイズを削減しパフォーマンスを向上させることが可能です。

ActiveSupport::MessagePackは、以下のようにメッセージシリアライザとして利用できます。

config.active_support.message_serializer = :message_pack

# または個別に指定する
ActiveSupport::MessageEncryptor.new(secret, serializer: :message_pack)
ActiveSupport::MessageVerifier.new(secret, serializer: :message_pack)

以下のようにcookieシリアライザとしても利用できます(#48103)。

config.action_dispatch.cookies_serializer = :message_pack

以下のようにキャッシュシリアライザとしても利用できます(#48104)。

config.cache_store = :file_store, "tmp/cache", { serializer: :message_pack }

# または個別に指定する
ActiveSupport::Cache.lookup_store(:file_store, "tmp/cache", serializer: :message_pack)

2.8 自動読み込みを拡張するconfig.autoload_libconfig.autoload_lib_once設定が導入

config.autoload_lib(ignore:)という新しい設定メソッドが導入されました(#48572)。このメソッドは、デフォルトでは自動読み込みパスに含まれていないlibディレクトリをアプリケーションの自動読み込みパスに追加するために利用されます。また、新しいアプリケーションではconfig.autoload_lib(ignore: %w(assets tasks))が生成されます。

このメソッドがconfig/application.rbまたはconfig/environments/*.rbから呼び出されると、libディレクトリをconfig.autoload_pathsおよびconfig.eager_load_pathsの両方に追加します。ただし、この機能はエンジンでは利用できません。

オートローダーによって管理されるべきではないlibディレクトリ内のサブディレクトリをignoreキーワード引数で指定することで、柔軟性を確保できます。たとえば、assetstasks、およびgeneratorsなどのディレクトリをignore引数に渡すことで除外できるようになります。

config.autoload_lib(ignore: %w(assets tasks generators))

config.autoload_lib_onceメソッド(#48610)は、config.autoload_libと似ていますが、libconfig.autoload_once_pathsに追加する点が異なります。

詳しくはZeitwerkの自動読み込みガイドを参照してください。

2.9 汎用の非同期クエリを対象とするActive Record API

Active Record APIに重要な改善が導入され、非同期クエリのサポートが拡張されました(#44446)。この拡張により、特に集計メソッド(countsumなど)や、(Relationでない)単一レコードを返すメソッドなど、あまり速くないクエリをより効率的に処理するニーズに応えます。

新しいAPIには、以下の非同期メソッドが含まれます。

  • async_count
  • async_sum
  • async_minimum
  • async_maximum
  • async_average
  • async_pluck
  • async_pick
  • async_ids
  • async_find_by_sql
  • async_count_by_sql

これらの中からasync_countメソッドを用いて、公開済み投稿の数を非同期的にカウントする方法の簡単な例を以下に示します。

# 同期的なカウント
published_count = Post.where(published: true).count # => 10

# 非同期なカウント
promise = Post.where(published: true).async_count # => #<ActiveRecord::Promise status=pending>
promise.value # => 10

これらの非同期メソッドは、特定のデータベースクエリにおいてパフォーマンスを大幅に向上可能な非同期な方法でこれらの操作を実行できます。

2.10 テンプレートで厳密なlocalsを設定可能になった

テンプレートでlocalsを明示的に設定できる新機能が導入されました(#45602)。 この拡張により、テンプレートに渡される変数を明確に制御できるようになります。

デフォルトのテンプレートは、任意のlocalsをキーワード引数として受け入れます。ただし、テンプレートファイルの先頭にlocalsをERBマジックコメントの形で追加することで、テンプレートが受け取るべきlocalsを定義できます。

localsは以下のように指定します。

<%# locals: (message:) -%>
<%= message %>

このlocalsには以下のようにデフォルト値も設定できます。

<%# locals: (message: "Hello, world!") -%>
<%= message %>

オプショナルのキーワード引数で以下のようにsplat **を使うことも可能です。

<%# locals: (message: "Hello, world!", **attributes) -%>
<%= tag.p(message, **attributes) %>

localsを完全に無効にしたい場合は、以下のように設定できます。

<%# locals: () %>

Action Viewは、#で始まるコメントをサポートするテンプレートエンジンであれば、ビューの任意の行にあるlocals:マジックコメントを処理し、パーシャルの任意の行にあるマジックコメントを読み取ります。

サポートされるのはキーワード引数だけです。位置引数やブロック引数を定義すると、レンダリング時にAction Viewエラーが発生します。

2.11 Rails.application.deprecatorsが追加

新しいRails.application.deprecatorsメソッド(#46049)は、アプリケーション内の管理された非推奨要素のコレクションを返し、個別の非推奨要素を手軽に追加および取得できます。

Rails.application.deprecators[:my_gem] = ActiveSupport::Deprecation.new("2.0", "MyGem")
Rails.application.deprecators[:other_gem] = ActiveSupport::Deprecation.new("3.0", "OtherGem")

このコレクションの設定は、コレクション内のすべての非推奨機能に影響を与えます。

Rails.application.deprecators.debug = true

Rails.application.deprecators[:my_gem].debug
# => true

Rails.application.deprecators[:other_gem].debug
# => true

場合によっては、特定のコードブロックですべての非推奨警告をミュートしたいことがあります。 deprecatorsコレクションを使うことで、ブロック内のすべてのdeprecator警告を手軽に無効化できます。

Rails.application.deprecators.silence do
  Rails.application.deprecators[:my_gem].warn    # 警告を表示しなくなる
  Rails.application.deprecators[:other_gem].warn # 警告を表示しなくなる
end

2.12 JSONのresponse.parsed_bodyでパターンマッチングをサポート

ActionDispatch::IntegrationTestのテストブロックがJSONレスポンスに対してresponse.parsed_bodyを呼び出すと、そのペイロードはHashWithIndifferentAccessで利用可能になります。これにより、Rubyのパターンマッチングと組み合わせられるようになり、Minitest組み込みのパターンマッチングサポートとも連携可能になります。

get "/posts.json"

response.content_type         # => "application/json; charset=utf-8"
response.parsed_body.class    # => Array
response.parsed_body          # => [{},...

assert_pattern { response.parsed_body => [{ id: 42 }] }

get "/posts/42.json"

response.content_type         # => "application/json; charset=utf-8"
response.parsed_body.class    # => ActiveSupport::HashWithIndifferentAccess
response.parsed_body          # => {"id"=>42, "title"=>"Title"}

assert_pattern { response.parsed_body => [{ title: /title/i }] }

2.13 response.parsed_bodyが拡張されてHTMLをNokogiriで解析可能になった

ActionDispatch::Testingモジュールが拡張され(#47144)、HTMLのresponse.bodyの値を解析してNokogiri::HTML5::Documentインスタンスにするサポートを追加します。

get "/posts"

response.content_type         # => "text/html; charset=utf-8"
response.parsed_body.class    # => Nokogiri::HTML5::Document
response.parsed_body.to_html  # => "<!DOCTYPE html>\n<html>\n..."

新たに追加されたNokogiriパターンマッチングのサポートと、Minitest組み込みのパターンマッチングのサポートを利用して、HTMLレスポンスの構造や内容に関するテストアサーションを行えるようになります。

get "/posts"

html = response.parsed_body # => <html>
                            #      <head></head>
                            #        <body>
                            #          <main><h1>何らかのメインコンテンツ</h1></main>
                            #        </body>
                            #     </html>

assert_pattern { html.at("main") => { content: "何らかのメインコンテンツ" } }
assert_pattern { html.at("main") => { content: /content/ } }
assert_pattern { html.at("main") => { children: [{ name: "h1", content: /content/ }] } }

2.14 ActionView::TestCase.register_parserの導入

ActionView::TestCaseを拡張して、ビューパーシャルでレンダリングするコンテンツを解析して既知の構造に変換する機能をサポートしました(#49194)。 デフォルトでは、以下が定義されています。

  • rendered_html: HTMLをNokogiri::XML::Nodeに変換
  • rendered_json: JSONをActiveSupport::HashWithIndifferentAccessに変換
test "renders HTML" do
  article = Article.create!(title: "Hello, world")

  render partial: "articles/article", locals: { article: article }

  assert_pattern { rendered_html.at("main h1") => { content: "Hello, world" } }
end
test "renders JSON" do
  article = Article.create!(title: "Hello, world")

  render formats: :json, partial: "articles/article", locals: { article: article }

  assert_pattern { rendered_json => { title: "Hello, world" } }
end

レンダリングしたコンテンツをRSSに変換するには、RSS::Parser.parse呼び出しを登録します。

register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }

test "renders RSS" do
  article = Article.create!(title: "Hello, world")

  render formats: :rss, partial: article, locals: { article: article }

  assert_equal "Hello, world", rendered_rss.items.last.title
end

レンダリングしたコンテンツをCapybara::Simple::Nodeに変換するには、:htmlパーサーにCapybara.string呼び出しを再登録します。

register_parser :html, -> rendered { Capybara.string(rendered) }

test "renders HTML" do
  article = Article.create!(title: "Hello, world")

  render partial: article

  rendered_html.assert_css "main h1", text: "Hello, world"
end

3 Railties

変更点について詳しくはChangelogを参照してください。

3.1 削除されたもの

  • 非推奨化されたbin/rails secrets:setupコマンドを削除(#47801)。

  • デフォルトのX-Download-Optionsヘッダー(Internet Explorerでしか使われていない)を削除(#43968)。

3.2 非推奨化

  • Rails.application.secretsの利用を非推奨化(#48472)。

  • secrets:showコマンドとsecrets:editコマンドが非推奨化、今後はcredentialsを利用する(#47801)。

  • Rails::Generators::Testing::Behaviour(英国スペル)を非推奨化、今後は米国スペルのRails::Generators::Testing::Behaviorを使う(#45180)。

3.3 主な変更点

  • production環境でのRailsコンソールをデフォルトでsandboxモードで起動できるようにするsandbox_by_defaultオプションが追加(#48984)。

  • 実行するテストを行範囲で指定できる新しい構文を追加(#48807)。

  • マイグレーションをコピーするためにrails railties:install:migrationsコマンドを実行したときに対象データベースの仕様を有効にするDATABASEオプションを追加(#48579)。

  • rails new --javascriptジェネレータでBunをサポート(#49241)。

    $ rails new my_new_app --javascript=bun
    
  • 遅いテストをテストランナーで表示する機能を追加(#49257)。

4 Action Cable

変更点について詳しくはChangelogを参照してください。

4.1 削除されたもの

特になし。

4.2 非推奨化

特になし。

4.3 主な変更点

  • capture_broadcastsテストヘルパーを追加(#48798)。ブロードキャストされたすべてのメッセージをブロック内でキャプチャする。

  • Redisのコネクションが失われたときにRedisのpub/subアダプタを自動再接続する機能を追加(#46562)。

  • ActionCable::Connection::Basebefore_commandafter_commandaround_commandコールバックを追加(#44696)。

5 Action Pack

変更点について詳しくはChangelogを参照してください。

5.1 削除されたもの

  • Request#content_typeの非推奨化された振る舞いを削除(689b277)。

  • config.action_dispatch.trusted_proxiesに単一の値を代入可能だった非推奨の機能を削除(1e70d0f)。

  • 非推奨化されていたpoltergeistwebkit(capybara-webkit)ドライバのシステムテストへの登録を削除(696ccbc)。

5.2 非推奨化

  • config.action_dispatch.return_only_request_media_type_on_content_typeを非推奨化(689b277)。

  • AbstractController::Helpers::MissingHelperErrorを非推奨化(#47199)。

  • ActionDispatch::IllegalStateErrorを非推奨化(#47200)。

  • パーミッションポリシーの古くなったディレクティブspeakervibratevrを非推奨化(#46199)。

  • config.action_dispatch.show_exceptionstruefalseを設定することを非推奨化(#45867)。今後は:all:rescuable:noneを使うこと。

5.3 主な変更点

  • ActionController::Parametersexclude?メソッドを追加。これはinclude?と逆の動作(#45887)。

  • ActionController::Parameters#extract_valueメソッドを追加。これはparamsからシリアライズ済みの値を抽出できる(#49042)。

  • カスタムロジックでCSRFトークンの保存と取り出しを行えるようになった(#44283)。

  • システムテストのスクリーンショットヘルパーにhtmlscreenshotキーワード引数を追加(#44720)。

6 Action View

変更点について詳しくはChangelogを参照してください。

6.1 削除されたもの

  • 非推奨化されていた定数ActionView::Pathを削除(23344d4)。

  • パーシャルにインスタンス変数をローカル変数として渡す非推奨のサポートを削除(8241178)。

6.2 非推奨化

特になし。

6.3 主な変更点

  • check_box_tagradio_button_tagchecked:をキーワード引数として渡せるようになった(#45527)。

  • HTML <picture>タグを生成するpicture_tagを追加(#48100)。

  • simple_formatヘルパーで:sanitize_options機能が使えるようになった(#48355)。これを用いてサニタイズ処理に追加オプションを指定できる。

    simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", {}, { sanitize_options: { attributes: %w[target href] } })
    # => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"
    

7 Action Mailer

変更点について詳しくはChangelogを参照してください。

7.1 削除されたもの

特になし。

7.2 非推奨化

  • config.action_mailer.preview_path(単数形)が非推奨化(#31595)。

  • パラメータを:argsキーワード引数経由でassert_enqueued_email_withに渡すことが非推奨化(#48194)。:paramsキーワード引数がサポートされたので、今後はこれを用いてparamsを渡すこと。

7.3 主な変更点

  • 複数のプレビューパスをサポートするconfig.action_mailer.preview_paths(複数形)を追加(#31595)。

  • ブロック内で送信された全メールをキャプチャするcapture_emailsテストヘルパーを追加(#48798)。

  • エンキューされた全メールジョブを配信するdeliver_enqueued_emailsActionMailer::TestHelperに追加(#47520)。

8 Active Record

変更点について詳しくはChangelogを参照してください。

8.1 削除されたもの

  • 非推奨化されていたActiveRecord.legacy_connection_handlingのサポートを削除(#44827)。

  • 非推奨化されていたActiveRecord::Baseの設定アクセサを削除(96c9db1)。

  • configs_forでの:include_replicasのサポートを削除。今後は:include_hiddenを使うこと(#47536)。

  • 非推奨化されていたconfig.active_record.partial_writesを削除(96b9fd6)。

  • 非推奨化されていたTasks::DatabaseTasks.schema_file_typeを削除(049dfd4)。

  • PostgreSQL向けのstructure dumpでの--no-commentsフラグを削除(#44633)。

8.2 非推奨化

  • #remove_connectionname引数を非推奨化(#48681)。

  • check_pending!を非推奨化(#48964)。今後はcheck_all_pending!を使うこと。

  • add_foreign_keydeferrable: trueオプションを非推奨化(#47659)。今後はdeferrable: :immediateを使うこと。

  • 単数形のTestFixtures#fixture_pathを非推奨化(#47675)。今後は複数形のTestFixtures#fixture_pathsを使うこと。

  • Baseからconnection_handlerへの委譲を非推奨化(#46274)。

  • config.active_record.suppress_multiple_database_warningを非推奨化(#46134)。

  • ActiveSupport::DurationをSQL文字列テンプレート内でバインドパラメータとして式展開することを非推奨化(#44438)。

  • all_connection_poolsを非推奨化し、connection_pool_listでオプションを明示的に指定する形に変わった(#45961)。

  • 主キーが:idでない場合にread_attribute(:id)が主キーを返す振る舞いを非推奨化(#49019)。

  • #mergerewhereオプションを非推奨化(#45498)。

  • 属性でないものをalias_attributeでエイリアスにすることを非推奨化(#48972)。

8.3 主な変更点

  • 複数のフィクスチャパスをサポートするTestFixtures#fixture_pathsを追加(#47675)。

  • has_secure_passwordauthenticate_byメソッドを追加(#43765)。

  • ActiveRecord::Persistenceupdate_attribute!を追加。 update_attributeと同様だが、before_*コールバックで:abortがスローされた場合はActiveRecord::RecordNotSavedをraiseする点が異なる(#44141)。

  • insert_allupsert_allでエイリアス属性も指定できるようになった(#45036)。

  • マイグレーションのadd_index:includeオプションを追加(PostgreSQLのみ)(#44803)。

  • #regroupクエリメソッドを追加(#47010)。これは.unscope(:group).group(fields)のショートハンド。

  • SQLite3アダプタに自動生成カラム、カスタム主キーのサポートを追加(#49290)。

  • SQLite3データベースコネクション用の設定に高パフォーマンスの新しいデフォルトを追加(#49349)。

  • whereにカラムの"タプル"構文を導入(#47729)。

    Topic.where([:title, :author_name] => [["The Alchemist", "Paulo Coelho"], ["Harry Potter", "J.K Rowling"]])
    
  • 自動生成されるインデックス名が最大62バイトになった(#47753)。この長さは、MySQL、PostgreSQL、SQLite3のインデックス名のデフォルトの最大長さに収まる

  • Trilogyデータベースクライアント用のアダプタを導入(#47880)。

  • 全コネクションプールにある全コネクションを即座にクローズするActiveRecord.disconnect_all!を追加(#47856)。

  • PostgreSQLのマイグレーションでenumのリネーム、値の追加、値のリネームが可能になった (#44898)。

  • レコードのidカラムの生の値にアクセスするActiveRecord::Base#id_valueを追加(#48930)。

  • enumvalidateオプションを追加(#49100)。

9 Active Storage

変更点について詳しくはChangelogを参照してください。

9.1 削除されたもの

  • Active Storageの設定で非推奨化されていた無効なデフォルトContent-Typeを削除(4edaa41)。

  • 非推奨化されていたActiveStorage::Current#hostメソッドとActiveStorage::Current#host=メソッドを削除(0591de5)。

  • 添付ファイルのコレクションへの代入時の非推奨化されていた振る舞いを削除(c720b7e)。コレクションへの追加ではなく、コレクションが置き換えられるようになった。

  • 非推奨化されていた、添付ファイルの関連付けからのpurgeメソッドとpurge_laterメソッドを削除(18e53fb)。

9.2 非推奨化

特になし。

9.3 主な変更点

  • ActiveStorage::Analyzer::AudioAnalyzerが、出力のmetadataハッシュでsample_ratetagsを出力するようになった(#48823#47749)。

  • 添付ファイルでpreviewメソッドやrepresentationメソッドを呼び出したときに定義済みのvariantを利用可能にするオプションを追加(#45098)。

  • variantをプリプロセス用に宣言できるpreprocessedオプションを追加(#47473)。

  • Active Storageのvariantを削除する機能を追加(#47150)。

    User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
    

10 Active Model

変更点について詳しくはChangelogを参照してください。

10.1 削除されたもの

特になし。

10.2 非推奨化

特になし。

10.3 主な変更点

  • LengthValidator:inオプションや:withinオプションでbeginless/endless rangeをサポート(#45138)。

    validates_length_of :first_name, in: ..30
    
  • validates_inclusion_ofvalidates_exclusion_ofでbeginless rangeをサポート(#45123)。

    validates_inclusion_of :birth_date, in: -> { (..Date.today) }
    
    validates_exclusion_of :birth_date, in: -> { (..Date.today) }
    
  • has_secure_passwordpassword_challengeアクセサを追加。password_challengeが設定されている場合、現在永続化済みのpassword_digestとマッチするかどうかをバリデーションする(#43688)。

  • バリデータにrecord引数なしのlambdaを渡せるようになった(#45118)。

    # 更新前
    validates_comparison_of :birth_date, less_than_or_equal_to: ->(_record) { Date.today }
    
    # 更新後
    validates_comparison_of :birth_date, less_than_or_equal_to: -> { Date.today }
    

11 Active Support

変更点について詳しくはChangelogを参照してください。

11.1 削除されたもの

  • Enumerable#sumの非推奨化されたオーバーライドを削除(3ec6297)。

  • 非推奨化されていたActiveSupport::PerThreadRegistryを削除(4eb6441)。

  • ArrayRangeDateDateTimeTimeBigDecimalFloatIntegerでフォーマットが#to_sに渡される非推奨のオプションを削除(e420c33)。

  • 非推奨化されていたActiveSupport::TimeWithZone.nameのオーバーライドを削除(34e296d)。

  • 非推奨化されていたactive_support/core_ext/uriファイルを削除(da8e6f6)。

  • 非推奨化されていたactive_support/core_ext/range/include_time_with_zoneファイルを削除(f0ddb77)。

  • ActiveSupport::SafeBufferでオブジェクトが暗黙でStringに変換されていたのを削除(f02998d)。

  • Digest::UUIDで定義されている定数に含まれていない名前空間IDを提供すると、誤ったRFC 4122 UUIDを生成する非推奨のサポートを削除(7b4affc)。

11.2 非推奨化

  • config.active_support.disable_to_s_conversionを非推奨化(e420c33)。

  • config.active_support.remove_deprecated_time_with_zone_nameを非推奨化(34e296d)。

  • config.active_support.use_rfc4122_namespaced_uuidsを非推奨化(7b4affc)。

  • SafeBuffer#clone_emptyを非推奨化(#48264)。

  • ActiveSupport::Deprecationをシングルトンとして利用することを非推奨化(#47354)。

  • ActiveSupport::Cache::MemCacheStoreDalli::Clientのインスタンスで初期化することを非推奨化(#47340)。

  • Notification::Event#childrenメソッドと#parent_of?メソッドを非推奨化(#43390

11.3 主な変更点

特になし。

12 Active Job

変更点について詳しくはChangelogを参照してください。

12.1 削除されたもの

  • QueAdapterを削除(#46005)。

12.2 非推奨化

特になし。

12.3 主な変更点

  • 複数のジョブを一括でエンキューするperform_all_laterが追加(#46603)。

  • ジョブジェネレータでジョブの親クラスを指定する--parentオプションが追加(#45528)。

  • ジョブが破棄されるときにコールバックを実行するafter_discardメソッドをActiveJob::Baseに追加(#48010)。

  • バックグラウンドのジョブエンキュー呼び出し元をログ出力するサポートを追加(#47839)。

13 Action Text

変更点について詳しくはChangelogを参照してください。

13.1 削除されたもの

特になし。

13.2 非推奨化

特になし。

13.3 主な変更点

特になし。

14 Action Mailbox

変更点について詳しくはChangelogを参照してください。

14.1 削除されたもの

特になし。

14.2 非推奨化

特になし。

14.3 主な変更点

  • Mail::Message#recipientsX-Forwarded-Toアドレスを追加(#46552)。

  • バウンスメールをメーラーのキューを通さずに送信するbounce_now_withメソッドをActionMailbox::Baseに追加(#48446)。

15 Ruby on Railsガイド

変更点について詳しくはChangelogを参照してください。

15.1 主な変更点

訳注:以下のガイドが新たに追加されました。

16 Credits

Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。

フィードバックについて

Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。

原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨

本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。

Railsガイド運営チーム (@RailsGuidesJP)

支援・協賛

Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。

  1. Star
  2. このエントリーをはてなブックマークに追加