はじめに
Rails 6 に追加された新機能を試す第96段。 今回は、 after_save_commit
編です。
Rails 6 では、 after_commit :hook, on: [:create :update]
を省略して書くことができる after_save_commit
が追加されました。
Ruby 2.6.4, Rails 6.0.0 で確認しました。
$ rails --version
Rails 6.0.0
今回は、 User の CRUD の機能を作成して、データベースに保存するときに保存された情報をログ出力してみます。
Rails プロジェクトを作る
$ rails new rails_sandbox
cd rails_sandbox
User の CRUD を作る
User の CRUD を作ります。
$ bin/rails g scaffold User name
User モデルを修正する
after_save_commit
を使ってログに情報を出力するように修正します。
class User < ApplicationRecord
after_save_commit :log_saved
def log_saved
Rails.logger.info("User(id = #{id}) #{name} is saved")
end
end
Userを登録する
bin/rails s
を実行し、ブラウザからユーザーを登録します。
コンソールを確認します。
...
User Create (0.9ms) INSERT INTO "users" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["name", "Taro"], ["created_at", "2019-10-04 23:27:19.728918"], ["updated_at", "2019-10-04 23:27:19.728918"]]
↳ app/controllers/users_controller.rb:30:in `block in create'
(1.3ms) COMMIT
↳ app/controllers/users_controller.rb:30:in `block in create'
User(id = 1) Taro is saved
...
User(id = 1) Taro is saved
と書き込まれているのがわかります。
User を更新する
ブラウザから User を更新します。
コンソールを確認します。
User Update (0.4ms) UPDATE "users" SET "name" = $1, "updated_at" = $2 WHERE "users"."id" = $3 [["name", "Hanako"], ["updated_at", "2019-10-04 23:29:01.317864"], ["id", 1]]
↳ app/controllers/users_controller.rb:44:in `block in update'
(1.3ms) COMMIT
↳ app/controllers/users_controller.rb:44:in `block in update'
User(id = 1) Hanako is saved
User(id = 1) Hanako is saved
と書き込まれているのがわかります。
従来の書き方
after_save_commit :log_saved
は、Rails 5以前の書き方だと
after_commit :log_saved, on: [:create, :update]
となります。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try096_after_save_commit