Rails 7.1の注目ポイント:
ActiveRecord::Base.normalizesを追加ActiveRecord::Base.generates_token_forを追加perform_all_later
Trilogy用アダプタの導入ActiveSupport::MessagePackを追加config.autoload_libとconfig.autoload_lib_onceを追加(拡張オートローディング用)localsを設定可能になったRails.application.deprecatorsを追加response.parsed_bodyのパターンマッチングをサポートresponse.parsed_bodyを拡張してHTMLをNokogiriでパース可能になったActionView::TestCase.register_parserを導入本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストを参照してください。
ActiveRecord::Base.normalizesが追加ActiveRecord::Base.generates_token_forが追加perform_all_laterが追加ActiveSupport::MessagePackが追加config.autoload_libとconfig.autoload_lib_once設定が導入localsを設定可能になったRails.application.deprecatorsが追加response.parsed_bodyでパターンマッチングをサポートresponse.parsed_bodyが拡張されてHTMLをNokogiriで解析可能になったActionView::TestCase.register_parserの導入既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 7.0までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 7.1にアップデートしてください。アップグレードの注意点などについてはRailsアップグレードガイドを参照してください。
新規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環境ですばやく立ち上げられるようにできます。
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"
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
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イベントが導入されます。これにより、一括エンキュー処理のトラッキングとレポートが精密に行われるようになります。
データベースとアプリケーションの両方で複合主キー(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
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"
ActiveSupport::MessagePackが追加ActiveSupport::MessagePackは、msgpack gemと統合されたシリアライザです(#47770)。ActiveSupport::MessagePackは、msgpackでサポートされている基本的なRubyの型に加えて、Time、ActiveSupport::TimeWithZone、ActiveSupport::HashWithIndifferentAccessなどの追加の型もシリアライズできます。ActiveSupport::MessagePackは、JSONやMarshalに比べてペイロードサイズを削減しパフォーマンスを向上させることが可能です。
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)
config.autoload_libとconfig.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キーワード引数で指定することで、柔軟性を確保できます。たとえば、assets、tasks、およびgeneratorsなどのディレクトリをignore引数に渡すことで除外できるようになります。
config.autoload_lib(ignore: %w(assets tasks generators))
config.autoload_lib_onceメソッド(#48610)は、config.autoload_libと似ていますが、libをconfig.autoload_once_pathsに追加する点が異なります。
詳しくはZeitwerkの自動読み込みガイドを参照してください。
Active Record APIに重要な改善が導入され、非同期クエリのサポートが拡張されました(#44446)。この拡張により、特に集計メソッド(count、sumなど)や、(Relationでない)単一レコードを返すメソッドなど、あまり速くないクエリをより効率的に処理するニーズに応えます。
新しいAPIには、以下の非同期メソッドが含まれます。
async_countasync_sumasync_minimumasync_maximumasync_averageasync_pluckasync_pickasync_idsasync_find_by_sqlasync_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
これらの非同期メソッドは、特定のデータベースクエリにおいてパフォーマンスを大幅に向上可能な非同期な方法でこれらの操作を実行できます。
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エラーが発生します。
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
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 }] }
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/ }] } }
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
変更点について詳しくはChangelogを参照してください。
非推奨化されたbin/rails secrets:setupコマンドを削除(#47801)。
デフォルトのX-Download-Optionsヘッダー(Internet Explorerでしか使われていない)を削除(#43968)。
Rails.application.secretsの利用を非推奨化(#48472)。
secrets:showコマンドとsecrets:editコマンドが非推奨化、今後はcredentialsを利用する(#47801)。
Rails::Generators::Testing::Behaviour(英国スペル)を非推奨化、今後は米国スペルのRails::Generators::Testing::Behaviorを使う(#45180)。
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)。
変更点について詳しくはChangelogを参照してください。
特になし。
特になし。
capture_broadcastsテストヘルパーを追加(#48798)。ブロードキャストされたすべてのメッセージをブロック内でキャプチャする。
Redisのコネクションが失われたときにRedisのpub/subアダプタを自動再接続する機能を追加(#46562)。
ActionCable::Connection::Baseにbefore_command、after_command、around_commandコールバックを追加(#44696)。
変更点について詳しくはChangelogを参照してください。
Request#content_typeの非推奨化された振る舞いを削除(689b277)。
config.action_dispatch.trusted_proxiesに単一の値を代入可能だった非推奨の機能を削除(1e70d0f)。
非推奨化されていたpoltergeistとwebkit(capybara-webkit)ドライバのシステムテストへの登録を削除(696ccbc)。
config.action_dispatch.return_only_request_media_type_on_content_typeを非推奨化(689b277)。
AbstractController::Helpers::MissingHelperErrorを非推奨化(#47199)。
ActionDispatch::IllegalStateErrorを非推奨化(#47200)。
パーミッションポリシーの古くなったディレクティブspeaker、vibrate、vrを非推奨化(#46199)。
config.action_dispatch.show_exceptionsにtrueやfalseを設定することを非推奨化(#45867)。今後は:all、:rescuable、:noneを使うこと。
ActionController::Parametersにexclude?メソッドを追加。これはinclude?と逆の動作(#45887)。
ActionController::Parameters#extract_valueメソッドを追加。これはparamsからシリアライズ済みの値を抽出できる(#49042)。
カスタムロジックでCSRFトークンの保存と取り出しを行えるようになった(#44283)。
システムテストのスクリーンショットヘルパーにhtmlとscreenshotキーワード引数を追加(#44720)。
変更点について詳しくはChangelogを参照してください。
特になし。
checkbox_tagとradio_button_tagにchecked:をキーワード引数として渡せるようになった(#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>"
変更点について詳しくはChangelogを参照してください。
特になし。
config.action_mailer.preview_path(単数形)が非推奨化(#31595)。
パラメータを:argsキーワード引数経由でassert_enqueued_email_withに渡すことが非推奨化(#48194)。:paramsキーワード引数がサポートされたので、今後はこれを用いてparamsを渡すこと。
複数のプレビューパスをサポートするconfig.action_mailer.preview_paths(複数形)を追加(#31595)。
ブロック内で送信された全メールをキャプチャするcapture_emailsテストヘルパーを追加(#48798)。
エンキューされた全メールジョブを配信するdeliver_enqueued_emailsをActionMailer::TestHelperに追加(#47520)。
変更点について詳しくはChangelogを参照してください。
非推奨化されていた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)。
#remove_connectionのname引数を非推奨化(#48681)。
check_pending!を非推奨化(#48964)。今後はcheck_all_pending!を使うこと。
add_foreign_keyのdeferrable: 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)。
#mergeのrewhereオプションを非推奨化(#45498)。
属性でないものをalias_attributeでエイリアスにすることを非推奨化(#48972)。
複数のフィクスチャパスをサポートするTestFixtures#fixture_pathsを追加(#47675)。
has_secure_passwordにauthenticate_byメソッドを追加(#43765)。
ActiveRecord::Persistenceにupdate_attribute!を追加。update_attributeと同様だが、before_*コールバックで:abortがスローされた場合はActiveRecord::RecordNotSavedをraiseする点が異なる(#44141)。
insert_allとupsert_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)。
enumにvalidateオプションを追加(#49100)。
encryptsで定義した属性で使われるActiveRecord::Encryptionのデフォルトのハッシュダイジェストが、デフォルト設定のSHA1からSHA256に変更された。これらのデフォルトにはsupport_sha1_for_non_deterministic_encryption = false も含まれており、データが再暗号化されていない場合、アプリは古いデフォルトのハッシュダイジェストで暗号化されたデータを復号化できなくなる可能性がある。
変更点について詳しくはChangelogを参照してください。
Active Storageの設定で非推奨化されていた無効なデフォルトContent-Typeを削除(4edaa41)。
非推奨化されていたActiveStorage::Current#hostメソッドとActiveStorage::Current#host=メソッドを削除(0591de5)。
添付ファイルのコレクションへの代入時の非推奨化されていた振る舞いを削除(c720b7e)。コレクションへの追加ではなく、コレクションが置き換えられるようになった。
非推奨化されていた、添付ファイルの関連付けからのpurgeメソッドとpurge_laterメソッドを削除(18e53fb)。
特になし。
ActiveStorage::Analyzer::AudioAnalyzerが、出力のmetadataハッシュでsample_rateとtagsを出力するようになった(#48823、#47749)。
添付ファイルでpreviewメソッドやrepresentationメソッドを呼び出したときに定義済みのvariantを利用可能にするオプションを追加(#45098)。
variantをプリプロセス用に宣言できるpreprocessedオプションを追加(#47473)。
Active Storageのvariantを削除する機能を追加(#47150)。
User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
変更点について詳しくはChangelogを参照してください。
特になし。
特になし。
LengthValidatorの:inオプションや:withinオプションでbeginless/endless rangeをサポート(#45138)。
validates_length_of :first_name, in: ..30
validates_inclusion_ofやvalidates_exclusion_ofでbeginless rangeをサポート(#45123)。
validates_inclusion_of :birth_date, in: -> { (..Date.today) }
validates_exclusion_of :birth_date, in: -> { (..Date.today) }
has_secure_passwordにpassword_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 }
変更点について詳しくはChangelogを参照してください。
Enumerable#sumの非推奨化されたオーバーライドを削除(3ec6297)。
非推奨化されていたActiveSupport::PerThreadRegistryを削除(4eb6441)。
Array、Range、Date、DateTime、Time、BigDecimal、Float、Integerでフォーマットが#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)。
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::MemCacheStoreをDalli::Clientのインスタンスで初期化することを非推奨化(#47340)。
Notification::Eventの#childrenメソッドと#parent_of?メソッドを非推奨化(#43390)
特になし。
変更点について詳しくはChangelogを参照してください。
QueAdapterを削除(#46005)。特になし。
複数のジョブを一括でエンキューするperform_all_laterが追加(#46603)。
ジョブジェネレータでジョブの親クラスを指定する--parentオプションが追加(#45528)。
ジョブが破棄されるときにコールバックを実行するafter_discardメソッドをActiveJob::Baseに追加(#48010)。
config.active_job.verbose_enqueue_logs設定でバックグラウンドのジョブエンキュー呼び出し元をログ出力するサポートを追加(#47839)。
変更点について詳しくはChangelogを参照してください。
特になし。
特になし。
特になし。
変更点について詳しくはChangelogを参照してください。
特になし。
特になし。
Mail::Message#recipientsにX-Forwarded-Toアドレスを追加(#46552)。
バウンスメールをメーラーのキューを通さずに送信するbounce_now_withメソッドをActionMailbox::Baseに追加(#48446)。
変更点について詳しくはChangelogを参照してください。
訳注:以下のガイドが新たに追加されました。
Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。