6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コールバックの際に使う self について

Last updated at Posted at 2021-11-03

開発環境

ruby 2.6.5
Ruby on Rails 5.2.5

前提

ユーザーの認証機能をつけているアプリ
ユーザーに boolean 型で admin というカラムをつけ、admin が true のユーザーを管理者としている

本題

管理権限を持ったユーザーがが0人にならないようにする
バリデーションの機能実装

class User < ApplicationRecord
  before_destroy :admin_exist_check
  before_update :admin_update_exist

  has_many :tasks, dependent: :destroy

 # 中略

  def admin_exist_check
    if User.where(admin: true).count <= 1 && self.admin == true (←ここ)
      throw(:abort)
    end
  end

  def admin_update_exist
    if User.where(admin: true).count == 1 && self.admin == false
      throw(:abort)
    end
  end

end

上記みたいなコードを書く。

なにかを参考にしながら書いたコードなんだけど
このコードをモデルに書くと admin というカラムが true のユーザーが0人にならないようになる

ただ self という部分に違和感
自分で書いといてあれだけど self ってなんだ。。


binding.irb
def admin_exist_check
    if User.where(admin: true).count <= 1 && self.admin == true (←ここ)
      throw(:abort)
    end
end

上のように動きを止めて、コンソール上で

self.admin 

と打つと true が返ってくる

さらにコンソール上で

self

と打つと

self
=> #<User id: 31, name: "adm", email: "xxx", password_digest: "$2a$12$mDmd3aFZR9D7korRsx/qvedQmflQo3QSz2h3i0BWebH...", created_at: "2021-06-07 13:44:56", updated_at: "2021-06-07 13:44:56", admin: true>

こんな風に値を保有していることがわかる。

つまりコールバックが発生した瞬間に呼び出されるメソッド内での self には
そのコールバックで変化する予定のリソースが入ってくる

ってことかな?笑。わかりません笑

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?