##モデルにメソッドを定義する理由
モデルに書くのはvalidatesやbelongs_to,has_manyなどだけでなく、メソッドも定義できる。
もちろんモデルを使わなくても小さいサービスであればコントローラーでも全然問題ないが、
理由として少し大きなサービスになってくると、すぐにコントローラーのコード量が増えてしまうからである。(ファットコントローラー)
その時は理解できても、数ヶ月後にコードを見返すと何のコードなのかわからなくなってしまう可能性がある。
##例を交えて解説
def index
@user = User.find(1)
@my_age = @user.too_young ⬅️
end
このtoo_youngがインスタンスメソッドというもので、モデルで書いたメソッドを
コントローラーで呼び出している。
class User < ApplicationRecord
validates :username, presence: true
validates :email, presence: true
#ここがインスタンスメソッド
def too_young
if self.age >= 20 #20歳以上の場合
return "大人です!"
else #20歳以下の場合
return "子供です!"
end
end
end
too_youngメソッド内に「self」というものがある。
この「self」は何かというとusers_controller.rbで定義された@userのこと。
@userというインスタンスに対して「.(ドット)」で繋げてインスタンスメソッドを呼び出す時、インスタンスメソッド内では「self」が使え、self=呼び出し元のインスタンス(@user)となる。
インスタントメソッド内のselfは省略可能
。
##インスタントメソッドとは
インスタンスメソッドとは、作成したインスタンスから実行出来るメソッドのこと。
initializeメソッドでインスタンス変数に代入し、情報を保持している。
インスタンスメソッドは、このインスタンスごとに保持している情報を使って処理を書くことが出来る。
インスタントメソッドとは別にクラスメソッドがあるが、使い分けはクラスメソッドは全体で扱う
べき情報を扱い、インスタンスメソッドは個々で扱う
べき情報を扱うことを認識しておけばいい。
##参考記事
Railsのモデルに書いたメソッドってどうやってコントローラで使うの?
【Ruby】 たい焼きで理解するオブジェクト指向におけるクラスの概念
【Ruby基礎】クラスメソッドとインスタンスメソッドの違いについて簡単にまとめてみた