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の実行時暗号化機能
データの暗号化が可能になった
bin/rails db:encryption:init
コマンドを実行してランダムなキーを生成- 結果を
bin/rails credentials:edit
で開いたエディタの画面に貼り付けて保存 - 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 に変更された