判定ロジックはモデルに書こう!!

目次

判定ロジックの例

例えば、掲示板アプリで、「rails勉強中!」のような投稿があった場合。

投稿した人だけが、編集したり、削除したりするような機能をつけたい!(投稿していない人が勝手に編集・削除できないようにする)という場合があると思う。

これを実現するためには、「投稿した人のidと今ログインしている人のidが一致」すればOK。

これが判定ロジックの一例。

これを普通に書くと

例えば、以下のようなviewファイルの記述になる。

<%= if @post.user_id == current_user.id %>
  <%= link_to '編集', post_path(@post)
  <%= link_to '削除', post_path(@post), method: :delete %>
<% end %>

ただし、これだと長ったらしい。

加えて、例えば10箇所に判定ロジックを使用していた場合。判定ロジックの内容を変更しようとすると、10箇所全てを直す必要があるので、ものすごく大変!

だったら、モデルに判定ロジックを書こう!

なので、基本的に自分で作成する判定ロジックについてはモデルに書いた方がスマート(仮に10箇所で使ってたとしても、判定ロジックの中身だけ、つまり1箇所だけの変更でOK!)

ということで、今回の例で判定ロジックを書くと、以下の通り。

まず、モデル内に以下記述。

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

そして、ロジックの呼び出しは以下の通り。

<% if current_user.own?(@post) %>
  <%= link_to '編集', post_path(@post)
  <%= link_to '削除', post_path(@post), method: :delete %>
<% end %>

これで、最初のコードと同じ結果が実現できる。

コードの解説

さて、先ほどのコードを噛み砕いて、理解していきます。

モデル内の判定ロジックは厳密に言うと、self.idを省略している書き方

なので、省略しないで書くと

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

なので、self.idはレシーバーのid。言い換えると、呼び出し元のオブジェクトのidということになる。

もっと簡単にいうと、.own?の左側の部分のid

()内については引数。なので、以上まとめると

なので、

<% if current_user.own?(@post) %>

という、コードについては

current_user.id == @post.id

の判定を行なっているという意味になります!