Rails 7 リリースノートについてまとめたものを備忘録として残しておく

Rails 7 系での新機能および変更点

JavaScriptフロントエンドの刷新

ESM(ECMAScript modules)や import maps を使用し、Node.js をインストールせずにモダンな JavaScript が利用可能
※デフォルトでは Hotwire, Stimulus, Turbo がインストールされる

CSS Bundling

  • 以下のサポートが追加
    • Tailwind CSS
    • PostCSS

アプリケーション新規作成時に指定可能

rails new myapp --css tailwind

既存に追加する場合は Gemfile に以下を追加して

gem 'cssbundling-rails'

以下のコマンドを実行することでインストールおよび初期設定が可能

bin/bundle install
bin/rails css:install:tailwind

Active Recordの実行時暗号化機能

データの暗号化が可能になった

  1. bin/rails db:encryption:init コマンドを実行してランダムなキーを生成
  2. 結果をbin/rails credentials:editで開いたエディタの画面に貼り付けて保存
  3. Model で以下のように指定
class User < ApplicationRecord
 encrypts :name
end

Spring のデフォルト値の変更

大規模なアプリケーション以外では Spring があまり意味をなさなくなったため、デフォルトがオフに変更

Sass と CSS ジェネレータの非標準化

最近では CSS フレームワークを使うようになっているため、Sass は使用されなくなってきている
そのため sass-rails Gem が標準では Gemfile に含まれないようになった
また、自動生成される CSS ファイルも拡張子が .scss ではなく .css のファイルになった
そして、モデルごとに CSS ファイルを生成しないようになった

ActiveRecordの新機能

以下が追加および変更になった

  • ActiveRecord::Base.normalizes
  • generates_token_for
  • async

Active Jobの変更

perform_all_later が追加された

Bunのサポート

JavaScript ランタイムとして Bun がサポートされた

非同期のSQLクエリによる結果の取得

ActiveRecord::Relation#load_async を使用することで、非同期で SQL クエリを実行できる

def index
  @articles = Article.per(params[:per]).page(params[:page]).load_async
  @categories = Category.active.load_async
end

バルクインサートで自動的にタイムスタンプを記録できる

Active Record の insert_all や upsert_all メソッドなどでバルクインサート・バルクアップサートでレコードを作成、更新する際に
created_at や updated_at などのタイムスタンプを自動でセットできるようになった

使用する場合は Methods の record_timestamps オプションに true を渡す必要がある

Article.insert_all([{ title: "What's new in Rails 7" }], record_timestamps: true)

Active Recordに in_order_of メソッドが追加

レコードを指定した順番で取得できる in_order_of メソッドが Active Record に追加された
例. ユーザID が1, 5, 3の順番になるように取得

User.in_order_of(:id, [1, 5, 3])
# SELECT "users".* FROM "users" ORDER BY FIELD("users"."id", 1, 5, 3)

SQLクエリにコメント自動付与

SQLのクエリに自動的にアプリケーション側の情報(Active Recordのメソッドが呼び出された、コントローラやジョブなどを含む)をコメントとして付与する機能

設定方法

config.active_record.query_log_tags = [ :application, :controller, :action, :job ]

出力例

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
#=> SELECT * FROM books /*application:MyApp;controller:books;action:index*/

Active Record に structurally_compatible? メソッドが追加

Active Record のリレーションが他のリレーションとデータの構造が同じかどうかチェックする structurally_compatible? メソッドが追加

Book.where("id = 1").structurally_compatible?(Book.where("author_id = 3"))
# => true
Book.joins(:categories).structurally_compatible?(Book.where("id = 1"))
# => false

weekday_options_for_select ヘルパメソッドの追加

曜日選択の option タグを生成する weekday_options_for_select タグが追加された

weekday_options_for_select
# => "<option value=\"Sunday\">Sunday</option>\n<option value=\"Monday\">Monday</option>\n
# <option value=\"Tuesday\">Tuesday</option>\n<option value=\"Wednesday\">Wednesday</option>\n
# <option value=\"Thursday\">Thursday</option>\n<option value=\"Friday\">Friday</option>\n
# <option value=\"Saturday\">Saturday</option>"
weekday_options_for_select(nil, index_as_value: true)
# => "<option value=\"0\">Sunday</option>\n<option value=\"1\">Monday</option>\n
# <option value=\"2\">Tuesday</option>\n<option value=\"3\">Wednesday</option>\n
# <option value=\"4\">Thursday</option>\n<option value=\"5\">Friday</option>\n
# <option value=\"6\">Saturday</option>"

button_to が HTTP メソッドとして PATCH を使用するように変更

以前のバージョンでは、 button_to タグは HTTP メソッドとして、 POST を使用されていた
Rails 7 からは PATCH を使用するようになったため、以前の挙動に合わせるには、button_to メソッドのオプションとして、method: :post を渡す必要がある

Active Storage の画像処理で使用されるライブラリの変更

Active Storage で画像処理に使われる Gem は、以前のバージョンでは mini_magick を使用していたが、Rails 7 からは vips に変更された