LoginSignup
3
6

More than 5 years have passed since last update.

クラスメソッド、インスタンスメソッドの使い方

Last updated at Posted at 2019-04-14

はじめに

コントローラーに書いたアクションの処理をモデルにメソッド化する際、メソッドについての理解が浅かったため呼び出し方、書き方に悩まされた。そのため、今回は実例を元に使い方について、記事にまとめてみた。
※これまで個人的にはモデルやクラス、インスタンスなど似たようなイメージを持っていたが、RailsのモデルはRubyのクラス。インスタンスはテーブルのレコードと考えれば理解しやすくなった。

実例(クラスメソッド)

修正前の状態

図1:topics_controller.rb
  def search_result
    @topics = Topic.where('title LIKE ?', "%#{params[:title]}%")
  end

図1はTopicモデルのテーブルから、あいまい検索した結果をインスタンス変数である、@topicsに格納している。これをメソッド化し、モデルに定義する。

修正後のコード

図2:topics_controller.rb
  def search_result
    @topics = Topic.search(params[:title])
  end
図3:topic.rb
  def self.search(title)
    where('title LIKE ?', "%#{title}%")
  end

検索するためのメソッドなので、メソッド名はモデルにsearchとしてメソッド化、その際の注意点として大きく2点ある。

1,使用するメソッドがクラスメソッドであるということ。

searchメソッドはクラスに使用するため、クラスメソッドでないといけない。そのため図3のようにメソッド名の前にselfを付ける。このselfはクラス自身を表している。ちなみにselfが抜けているとインスタンスメソッドとなり、クラスから生成されたインスタンスにしか使用できない。

2,受け取ったparamsを引数としてメソッドに渡さないといけないこと。

ビューからフォームで受け取ったparamsをメソッドの引数として渡してあげないと、中身の処理が機能しないため、受け取った値は引数で渡してあげること。

実例(インスタンスメソッド)

修正前の状態

図4:topics_controller.rb
def destroy

 # 省略

  if @current_user.admin_status == true
    redirect_to(admin_path)
  else
    redirect_to("/")
  end
end

図4はトピックの削除機能で@current_userログインしているユーザーが管理者であるかないかで条件分岐をしている。このadmin_status == trueをメソッド化し、モデルに定義する。

修正後のコード

図5:topics_controller.rb
def destroy

 # 省略

  if @current_user.admin?
    redirect_to(admin_path)
  else
    redirect_to("/")
  end
end
図6:user.rb
  def admin?
    admin_status == true
  end

管理者であるかを確認するためのメソッドなので、メソッド名はモデルにadmin?としてメソッド化。また、その際の注意点として大きく2点ある。

1,使用するメソッドがインスタンスメソッドであるということ。

admin?メソッドはインスタンスに使用するため、インスタンスメソッドでないといけない。そのため図6のようにそのままメソッドを書くことでインスタンスメソッドになる。

2,trueやfalseを返す時のメソッドは末尾に?を付けること。

Rubyでは慣用的に、真偽値を返すタイプのメソッドを示すために使われる。そのため、末尾に?を付けることで直感的にもわかりやすくなる。

学び

今回、痛感したのは何気なく使っているメソッド周りのことを全然理解できていなかったということ。何をしてもエラーの連続で訳がわからない状態になったりもしたが、サポートしていただいておかげで、定義しているメソッドがクラスメソッドなのか、インスタンスメソッドなのか?またそのメソッドをどう呼ぶのか?をより意識するようになれた。これからも努力を惜しまず理解を深めていきたい。

3
6
2

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