コメントの編集・削除ボタン表示の判定ロジック(モデルに記載)

今回の実装ではコメントの編集・削除ボタンが表示されるのは、コメントを投稿した本人のみにしたい。

判定ロジックを用いるが、今後メンテナンスをするときのためにmodelのみにまとめて記載する。

♡判定ロジックはUserモデルにまとめて記載する等、自分で決めておくと良いらしい。

♡クラスメソッドに定義して引数に判定に必要なオブジェクトをすべて記載するのではなく、インスタンスメソッドとして記載する

→クラスメソッドにしてしまうと判定用のオブジェクトを全て記載しなければいけなくなるため。

self.my_comment?(current_user, comment)
  current_user == comment.user
end

とした場合、

if User.my_comment?(current_user, @comment)

としなければならなくなる。

インスタンスメソッドで記載した場合、

if current_user.my_comment?(@comment)

となり、引数の記載がシンプルになる。

♡comment.user→ belongs_to :user の定義により使えるようになるアソシエーションメソッド。

♡commentモデルにある user_id を使うよう指定してしまうと、Usersテーブルから対象のレコードを取ってきてしまい、SQLが発行される。

♡comment.user_idであれば、commentインスタンスが持っている user_id を使って比較しているに過ぎないのでSQLが発行されない。

♡selfレシーバは省略して記載するのが一般的。(Rubocopにも引っかかった)

(なので理想的な形は以下のようになるそう)

 

app/model/user.rbの場合

def my_comment?(comment)
  self == comment.user
end

# 表示したいview側で以下のように記載
# if current_user.my_comment?(@comment) 
def my_comment?(comment)
  comment.user_id == id
  # comment.user_id == self.id の省略形
end

最も汎用性の高い記載方法↓

def own?(object)
  object.user_id == id
end

view側で以下のように記述する。

<% if current_user.own?(comment) %>