Rails 7.2の注目ポイント:
本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストを参照してください。
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 7.1までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 7.2にアップデートしてください。アップグレードの注意点などについてはRailsアップグレードガイドを参照してください。
Development Container(以下Dev Container)を使うと、コンテナ環境をフル機能の開発環境として利用可能になります。
Rails 7.2から、アプリケーションでDev Container設定を生成する機能が追加されました。追加される設定には、.devcontainer/
フォルダ内のDockerfile
ファイル、docker-compose.yml
ファイル、devcontainer.json
ファイルなどがあります。
デフォルトのDev Containerには以下が含まれます。
Dev Containerを利用する新規アプリケーションを生成するには、以下のコマンドを実行します。
$ rails new myapp --devcontainer
既存のアプリケーション用にdevcontainer設定を生成するには、devcontainer
コマンドが利用可能です。
$ rails devcontainer
詳しくは、Dev Containerでの開発ガイドを参照してください。
Railsの全アクションへのアクセス(またはonly:
やexcept:
で指定されたアクションのみへのアクセス)を許可する、ブラウザバージョン指定機能が追加されました。
versions:
に渡したハッシュまたは名前付きセットのみが、指定バージョンより下の場合にブロックされます。
つまり、それ以外の未知のブラウザや、User-Agentヘッダーを送信していないエージェントはアクセスを許可されます。
ブロックされたブラウザには、デフォルトでHTTPステータスコード"406 Not Acceptable"がpublic/406-unsupported-browser.html
ファイルで配信されます。
例:
class ApplicationController < ActionController::Base # 以下をネイティブサポートするブラウザのみを許可: # webp画像、webプッシュ、バッジ、importmap、CSSネスティングと`:has` allow_browser versions: :modern end class ApplicationController < ActionController::Base # ChromeとOpera: 全バージョンを許可する # Internet Explorer: どのバージョンも不許可にする # Safari: 16.4以上を許可する # Firefox: 121以上を許可する allow_browser versions: { safari: 16.4, firefox: 121, ie: false } end class MessagesController < ApplicationController # ApplicationControllerでブロックされるブラウザに加えて、 # showアクションでOpera 104未満とChrome 119未満もブロックする allow_browser versions: { opera: 104, chrome: 119 }, only: :show end
新規生成されるアプリケーションでは、このバージョン保護機能がApplicationController
に設定されます。
詳しくは、Rails APIドキュメントのallow_browser
を参照してください。
従来は、Railsが古いRubyとの互換性を失うのは、Railsの新しいメジャーバージョンがリリースされた場合だけでしたが、このポリシーを変更します。その理由は、従来のポリシーではサポートが終了して久しいRubyバージョンをサポートしなければならなくなったり、Railsのメジャーバージョンを上げるたびに複数バージョンのRubyをサポート終了しなければならなくなったりするためです。
今後は、Railsのマイナーバージョンがリリースされるときに、その時点でサポートが終了しているRubyバージョンをサポート対象から外します。
Rails 7.2では、Ruby 3.1が新しい最小バージョンになります。
Railsを用いたPWAアプリケーションの作成をより適切にサポートするための準備として、マニフェストとサービスワーカー用にデフォルトのPWAファイルを生成するようになりました。これらのファイルはapp/views/pwa
から配信され、ERBで動的にレンダリングできます。これらのファイルは、生成されたルーティングファイル内のデフォルトのルーティングとともに、rootディレクトリに明示的にマウントされます。
詳しくは、#50528を参照してください。
Railsアプリケーションに、rubocop-rails-omakaseのルールセットで設定済みのRuboCopがデフォルトで含まれるようになりました。
Ruby は、さまざまな方言を許容するだけでなく、その多様性を尊重する、美しく表現力豊かな言語です。Rubyは、あらゆるライブラリやフレームワークやアプリケーションを統一されたスタイルだけで記述することを意図した言語ではありません。あなたやあなたのチームが、喜びをもたらす特定のハウススタイルを培ってきた場合は、それを尊重すべきです。
このRuboCopスタイルは、特定の方言をまだ採用していない人やチームに向けたコレクションです。合理的な根拠のある設定や、少なくともRubyのコーディングスタイルを統一する設定でスタートできるデフォルトルールを採用することで、メリットを得られる方を念頭に置いています。
個別のルールは、その書き方が正しいか間違っているかではなく、Rails作成者にとっての「Railsらしい美しい書き方」を表しているに過ぎません。ルールをそのまま使うもよし、これを元に独自ルールを作るのもよし、ルール策定のヒントを得るのに使うもよし、皆さんの望むようにお使いください。
Railsの新規アプリケーションに、デフォルトでGitHub CIワークフロー用のファイルが追加されるようになりました。これにより、特にRails初心者がセキュリティスキャンやlintやテストを最初から自動化できるようになります。この機能は、単体テストの開始以来行われてきたことを自然な形で現代に引き継いだものであると私たちは考えています。
もちろんGitHub Actionsは、無料トークンを使い切った後は、プライベートリポジトリ用の商用クラウド製品として利用することになります。しかし、GitHubとRailsの緊密な関係、初心者にとって使いやすい圧倒的なプラットフォームデフォルト設定、そして初心者が身につけるのにふさわしいCI習慣を学べる教育的価値を考えると、これは許容できるトレードオフであると考えています。
Brakeman gemは、Railsの一般的なセキュリティ脆弱性がproduction環境に侵入するのを防ぐ優れた方法です。
新しいアプリケーションにはBrakemanがインストールされるようになり、GitHub CIワークフローと組み合わせることで、プッシュのたびに自動的に実行されます。
Railsで使われるPuma(Webサーバー)のデフォルトのスレッド数が5から3に変更されました。
最適化されたRailsアプリケーションの性質上、高速なSQLクエリとジョブ経由で実行される低速のサードパーティ呼び出しが組み合わさった状態でのスレッド数が多すぎると、RubyはGVL(Global VM Lock)が解放されるまでかなり長い間待つことになる可能性があり、レイテンシ(リクエストやレスポンスの時間)に悪影響を及ぼします。
慎重な検討と調査の結果、production環境で実際に実行されているアプリケーションで実証された経験に基づいて、デフォルトのスレッドを3にすることでコンカレンシー(並行性)とパフォーマンスのバランスが取れていると判断しました。
この変更に関する議論について詳しくは、#50450で確認できます。
Active Jobでよくある間違いは、以下のようにトランザクションの内部でジョブをエンキューしてしまうことです。このような書き方をすると、トランザクションがコミットされる前に別のプロセスによってジョブが拾われて実行される可能性があり、さまざまなエラーが発生します。
Topic.transaction do topic = Topic.create NewTopicNotificationJob.perform_later(topic) end
Active Jobが改修されて、ジョブのエンキューをトランザクションのコミットが完了するまで自動的に延期し、トランザクションがロールバックされた場合はジョブを削除するようになりました。
この振る舞いは、さまざまなキュー実装で無効にできます。以下のようにジョブ単位で無効にしたり矯正したりできます。
class NewTopicNotificationJob < ApplicationJob self.enqueue_after_transaction_commit = :never end
詳しくは、#51426を参照してください。
この機能は、トランザクションコールバックをレコードの外で登録可能になったことで実現できました。
ActiveRecord::Base.transaction
はActiveRecord::Transaction
オブジェクトをyield
するようになりました。ここにコールバックを登録できます。
Article.transaction do |transaction| article.update(published: true) transaction.after_commit do PublishNotificationMailer.with(article: article).deliver_later end end
ActiveRecord::Base.current_transaction
も追加され、ここにもコールバックを登録できるようになりました。
Article.current_transaction.after_commit do PublishNotificationMailer.with(article: article).deliver_later end
最後に、ActiveRecord.after_all_transactions_commit
が追加されました。これは、トランザクションの内部または外部で実行される可能性があり、かつステートの変更が正しく永続化された後で実行されなければならないコードに対して使えます。
def publish_article(article) article.update(published: true) ActiveRecord.after_all_transactions_commit do PublishNotificationMailer.with(article: article).deliver_later end end
詳しくは、#51474を参照してください。
YJITは、Ruby 3.1以降のCRubyで利用可能なJIT(Just-In-Time)コンパイラです。YJITはRailsアプリケーションのパフォーマンスを大幅に向上させることが可能で、レイテンシを15〜25%改善できます。
Rails 7.2をRuby 3.3以降で実行すると、YJITがデフォルトで有効になります。
YJITを無効にするには以下の設定を行います。
Rails.application.config.yjit = false
2021年12月にリリースされたRails 7.0では、Rails公式ホームページ起動画面が新しくなりましたが、Rails GuidesのWebデザインは2009年からほとんど変更されていませんでした。この点は見逃せません(皆さんからフィードバックをいただきました)。
現在、Railsフレームワークの複雑さを解消し、ドキュメントの一貫性と明瞭性を高めて最新の内容にするための作業が全面的に進められているので、この機会にRails GuidesのWebデザインも同様にモダンかつシンプルで新鮮なものにする作業に取り組むときが来ました。
UXデザイナーJohn Athaydeとの共同作業によって、Railsホームページの新しい外観や雰囲気をRails Guidesにも取り入れ、すっきりと洗練された最新デザインに変えました。
レイアウトは従来と同じですが、今度からRails Guidesに以下の変更が反映されます。
Webデザインの変更前と変更後の画像については、Rails公式ブログのお知らせを参照してください。
Rubyのメモリアロケーションにmalloc
が使われていると、特にPumaで使われているようなマルチスレッドでメモリ断片化問題が発生する可能性があります。別のパターンを利用するアロケータに切り替えると、メモリ使用量を大幅に削減できる可能性があります。
Rails 7.2のDockerfileでは、メモリアロケーション最適化用のjemallocがデフォルトで設定されるようになりました。
Puma-devは、Dockerを使っていない環境で複数のRailsアプリケーションを同居させる形でローカル開発するのに最適な方法です。
bin/setup
を実行すると、Puma-devをセットアップする方法を提案する新しいコメントが表示されるようになりました。
変更点について詳しくはChangelogを参照してください。
非推奨化されていたRails::Generators::Testing::Behaviour
を削除。
非推奨化されていたRails.application.secrets
を削除。
非推奨化されていたRails.config.enable_dependency_loading
を削除。
非推奨化されていたfind_cmd_and_exec
コンソールヘルパーを削除。
rails new
コマンドやrails db:system:change
コマンドからoracle
、sqlserver
、JRuby固有のデータベースアダプタのサポートを削除。
ジェネレータからconfig.public_file_server.enabled
オプションを削除。
rubocop-rails-omakase gemのRuboCop
ルールを新規アプリケーションとプラグインの両方にデフォルトで追加。
Brakeman
を新規アプリケーションにセキュリティチェック用デフォルト設定として追加。
Dependabot
、Brakeman
、RuboCop
用のGitHub CIファイルを追加し、新規アプリケーションとプラグインの両方についてテストをデフォルトで実行するようになった。
YJITがRuby 3.3以降の新規アプリケーションでデフォルトで有効になった。
以下を実行することで.devcontainer
フォルダが生成されるようになった(VS Codeでアプリケーションをコンテナ実行するのに用いられる)。
$ rails new myapp --devcontainer
イニシャライザをテストするRails::Generators::Testing::Assertions#assert_initializer
が導入された。
新規アプリケーションのシステムテストでヘッドレスChromeがデフォルトで使われるようになった。
BACKTRACE
環境変数で通常のサーバー実行時にバックトレースのクリーニングを無効にするサポートが追加された(従来はテスト時のみ利用可能だった)。
マニフェストおよびサービスワーカー用のPWA(Progressive Web App)ファイルがデフォルトで追加され、app/views/pwa
から配信されるようになり、ERBで動的にレンダリング可能になった。
変更点について詳しくはChangelogを参照してください。
変更点について詳しくはChangelogを参照してください。
非推奨化されていたActionDispatch::IllegalStateError
定数を削除。
非推奨化されていたAbstractController::Helpers::MissingHelperError
定数を削除。
非推奨化されていたActionController::Parameters
とHash
の比較機能を削除。
非推奨化されていたRails.application.config.action_dispatch.return_only_request_media_type_on_content_type
を削除。
パーミッションポリシーの非推奨化されていたspeaker
、vibrate
、vr
ディレクティブを削除。
Rails.application.config.action_dispatch.show_exceptions
の非推奨化されていた設定(true
やfalse
に設定可能)を削除。
Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality
を非推奨化。変更点について詳しくはChangelogを参照してください。
@rails/ujs
が削除され、Turboに置き換えられた。tag.br
タグビルダーを使う場合に、void要素にコンテンツを渡すことが非推奨化された。変更点について詳しくはChangelogを参照してください。
非推奨化されていたconfig.action_mailer.preview_path
を削除。
assert_enqueued_email_with
で非推奨化されていた:args
からのパラメータを削除。
変更点について詳しくはChangelogを参照してください。
非推奨化されていたRails.application.config.active_record.suppress_multiple_database_warning
を削除。
存在しない属性名を指定してalias_attribute
を呼び出す非推奨化サポートを削除。
ActiveRecord::Base.remove_connection
で非推奨化されていたname
引数を削除。
非推奨化されていたActiveRecord::Base.clear_active_connections!
を削除。
非推奨化されていたActiveRecord::Base.clear_reloadable_connections!
を削除。
非推奨化されていたActiveRecord::Base.clear_all_connections!
を削除。
非推奨化されていたActiveRecord::Base.flush_idle_connections!
を削除。
非推奨化されていたActiveRecord::ActiveJobRequiredError
を削除。
コネクションアダプタで引数を2つ渡してexplain
を定義する非推奨化サポートを削除。
非推奨化されていたActiveRecord::LogSubscriber.runtime
メソッドを削除。
非推奨化されていたActiveRecord::LogSubscriber.runtime=
メソッドを削除。
非推奨化されていたActiveRecord::LogSubscriber.reset_runtime
メソッドを削除。
非推奨化されていたActiveRecord::Migration.check_pending!
メソッドを削除。
ActiveRecord::MigrationContext
にSchemaMigration
とInternalMetadata
クラスを引数として渡す非推奨化サポートを削除。
単数形の関連付けを複数形の名前で参照する非推奨の振る舞いを削除。
非推奨化されていたTestFixtures.fixture_path
を削除。
ActiveRecord::Base#read_attribute(:id)
がカスタム主キー値を返す非推奨化サポートを削除。
serialize
にコーダーやクラスを第2引数として渡す非推奨化サポートを削除。
データベースアダプタの非推奨化されていた#all_foreign_keys_valid?
を削除。
非推奨化されていたActiveRecord::ConnectionAdapters::SchemaCache.load_from
を削除。
非推奨化されていたActiveRecord::ConnectionAdapters::SchemaCache#data_sources
を削除。
非推奨化されていた#all_connection_pools
を削除。
role
引数が指定されていない場合に、現在のロールのコネクションプールで#connection_pool_list
、#active_connections?
、#clear_active_connections!
、#clear_reloadable_connections!
、#clear_all_connections!
、#flush_idle_connections!
が適用される非推奨化サポートを削除。
非推奨化されていたActiveRecord::ConnectionAdapters::ConnectionPool#connection_klass
を削除。
非推奨化されていた#quote_bound_value
を削除。
ActiveSupport::Duration
を変換せずに式展開で渡せる非推奨化サポートを削除。
add_foreign_key
にdeferrable: true
を渡す非推奨化サポートを削除。
ActiveRecord::Relation#merge
にrewhere
を渡す非推奨化サポートを削除。
トランザクションブロックをreturn
、break
、またはthrow
で終了するとロールバックする非推奨化された振る舞いを削除。
Rails.application.config.active_record.allow_deprecated_singular_associations_name
を非推奨化。
Rails.application.config.active_record.commit_transaction_on_non_local_return
を非推奨化。
変更点について詳しくはChangelogを参照してください。
非推奨化されていたconfig.active_storage.replace_on_assign_to_many
を削除。
非推奨化されていたconfig.active_storage.silence_invalid_content_types_warning
を削除。
変更点について詳しくはChangelogを参照してください。
変更点について詳しくはChangelogを参照してください。
非推奨化されていたActiveSupport::Notifications::Event#children
とActiveSupport::Notifications::Event#parent_of?
を削除。
以下のメソッドをdeprecatorを渡さずに呼び出せる非推奨サポートを削除。
deprecate
deprecate_constant
ActiveSupport::Deprecation::DeprecatedObjectProxy.new
ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new
ActiveSupport::Deprecation::DeprecatedConstantProxy.new
assert_deprecated
assert_not_deprecated
collect_deprecations
非推奨化されていたActiveSupport::Deprecation
のインスタンスへの委譲を削除。
非推奨化されていたSafeBuffer#clone_empty
を削除。
#to_default_s
from Array
、Date
、DateTime
、Time
で非推奨化されていた#to_default_s
を削除。
キャッシュストレージの非推奨化されていた:pool_size
オプションと:pool_timeout
オプションを削除。
非推奨化されていたconfig.active_support.cache_format_version = 6.1
サポートを削除。
非推奨化されていたActiveSupport::LogSubscriber::CLEAR
定数とActiveSupport::LogSubscriber::BOLD
定数を削除。
ログテキストをActiveSupport::LogSubscriber#color
の位置引数ブーリアンで太字にする非推奨化サポートを削除。
非推奨化されていたconfig.active_support.disable_to_s_conversion
を削除。
非推奨化されていたconfig.active_support.remove_deprecated_time_with_zone_name
を削除。
非推奨化されていたconfig.active_support.use_rfc4122_namespaced_uuids
を削除。
MemCacheStore
にDalli::Client
インスタンスを渡せる非推奨化サポートを削除。
変更点について詳しくはChangelogを参照してください。
非推奨化されていたBigDecimal
引数向けのプリミティブなシリアライザを削除。
scheduled_at
属性に数値を設定できる非推奨化サポートを削除。
retry_on
の:wait
オプションの非推奨化された:exponentially_longer
値を削除。
Rails.application.config.active_job.use_big_decimal_serialize
を非推奨化。変更点について詳しくは[Changelog][active-text]を参照してください。
変更点について詳しくはChangelogを参照してください。
変更点について詳しくはChangelogを参照してください。
Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。