LoginSignup
1
1

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す96(after_save_commit 編)

Posted at

はじめに

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 を使ってログに情報を出力するように修正します。

app/models/user.rb
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 を実行し、ブラウザからユーザーを登録します。

new.png

コンソールを確認します。

...
  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 を更新します。

edit.png

コンソールを確認します。

  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

参考情報

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1