ふとたまにみるselfはなんだろう、言語化できないなと
思ったので調べてみることにしました。
あと、インスタンスメソッドにも理解が浅いなと感じたため
調べて記事にしました
以下のモデルを例に進めていきます
class User < ApplicationRecord
#Article(記事)モデルとの紐付け
has_many :article
validates :name, presence: true
validates :email, presence: true
end
インスタンスメソッド
下記のようなデータが中に入っていたとする
| カラム名 | データ |
|---|---|
| name | test1 |
| test1@mail.com | |
| age | 19 |
| password | test1 |
class UsersController < ApplicationController
def index
#IDが1のuserを検索
@user = User.find(1)
#「.call_age」とは…
@my_age = @user.call_age
end
end
「call_age」メソッドはモデルに書いたメソッドで
コントローラーから呼び出しています
class User < ApplicationRecord
#Article(記事)モデルとの紐付け
has_many :article
validates :name, presence: true
validates :email, presence: true
def call_age
if self.age >= 20 #20歳以上の場合
return "私は大人です"
else #20歳以下の場合
return "私は子供です"
end
end
end
では、インスタンスメソッドとは
その名の通りにインスタンスに対して使用するメソッドのこと
通常のメソッドは、プログラム中からならいつでも呼び出せるのに対して
インスタンスメソッドは、作成されたオブジェクトからしか呼び出すことが出来ない
メソッドの中身を見ていく
そして、メソッドの内容を見ていく
class UsersController < ApplicationController
def index
@user = User.find(1)
@my_age = @user.call_age
end
end
class User < ApplicationRecord
has_many :article
validates :name, presence: true
validates :email, presence: true
def call_age
if self.age >= 20
return "私は大人です"
else
return "私は子供です"
end
end
end
コントローラー内の「@user」と、モデル内の「self」は
中身が同じ
id: 1, name: "test1", email: "test1@mail.com", age: 19
という中身が入っています
インスタンスメソッドの結果は、現在「self.age」には「19」というデータが
入っていますので、条件ではelseを通り「私は子供です」という結果が得られます
class User < ApplicationRecord
has_many :article
validates :name, presence: true
validates :email, presence: true
def call_age
if self.age >= 20
return "私は大人です"
else
return "私は子供です"
end
end
end
コントローラーにデバックを挟む
class UsersController < ApplicationController
def index
@user = User.find(1)
@my_age = @user.call_age
#デバックを挟む
binding.pry
end
end
[1] pry(#<UsersController>)> @user.call_age
[2] pry(#<UsersController>)> "私は子供です"
という結果が得られているので大丈夫そうですね
まとめ
・selfは、クラスから作成されているインスタンスと中身が同じ
・インスタンスメソッドは、作成されたオブジェクトからしか呼び出すことが出来ない
それと、コントローラーでも
モデルに書いたインスタンスメソッドを書くことはできます。
しかし、なるべくDBとのやりとりをするようなメソッドはモデルに
書くほうがいいので、今回はモデルにメソッドを作成しました。
使い分けれるように勉強していきたいです
参考記事
チェリー本
https://qiita.com/leavescomic1/items/99f32f45cd04035f146c
https://qiita.com/tbpgr/items/56eb65c0ea5882abbb07
https://qiita.com/right1121/items/c74d350bab32113d4f3d