ぺんぎんのRails日記

ぺんぎん。エンジニア経験ゼロ。Rails勉強中。

ログイン中ユーザーの投稿に編集用アイコンを表示する

ログインしているユーザーが自分の投稿を編集できるように、編集用のえんぴつマークのアイコンをFontAwesomeを使って表示させます。  

自分以外のユーザーの投稿やコメントには編集アイコンを表示させないようにします。

 

ログインしているユーザーが投稿を作成したユーザーかどうか判定する

sorceryのcurrent_userメソッドを使って、ログイン中ユーザーと投稿を作成したユーザーが一致するかどうかを判定します。  

 

掲示板 _post.html.erb

<% if current_user.id == post.user_id %>
  <a href="#">
    <i class="fa fa-pen"></i>
  </a>
<% end %>

 

コメント _comment.html.erb

<% if current_user.id == comment.user_id %>
  <a href="#">
    <i class="fa fa-pen"></i>
  </a>
<% end %>

これは一見良さそうに見えますが、よく見ると掲示板とコメントで同じようなコードを書いています。

postとcommentで違うモデルを扱っているから仕方ないじゃん!と思いますが、ユーザーのidを取って来ている点で同じなので、まとめられるんです。

 

Userモデルで共通化する

Userモデルでまとめてしまいましょう!

user.rb

def own?(object)

  object.user_id == self.id  #selfは省略可

end

objectで共通化しています。これでpostでもcommentでも、引数を指定して使えるようになります。
ちなみにインスタンスメソッドの中でselfを使うと、そのメソッドを利用したレシーバを参照することができます。
以下のビューでcurrent_user.own?のように使うので、この場合のselfの中身はuserが入るようになりますことになります。
(current_userはsorceryによって作られたログイン中ユーザーを特定するメソッドです)

 

 

投稿 _post.html.erb

<% if current_user.own?(post) %>
  <a href="#">
    <i class="fa fa-pen"></i>
  </a>
<% end %>

コメント _comment.html.erb

<% if current_user.own?(comment) %>
  <a href="#">
    <i class="fa fa-pen"></i>
  </a>
<% end %>

モデルで定義したown?メソッドを使って、ログイン中ユーザーのidとpostやcommentのuser_idを比較しています。  

 

完成です! Image from Gyazo