良いね機能実装で使ったぼっち演算子(&)

75日目です。
個人アプリにいいね機能を実装したのですが、その際エラーが起きたので紹介します。

ぼっち演算子(&)とは

Ruby2.3以降で使えるようになったメソッドで、メソッドに続けて記述すると、そのメソッドがnilでなかった場合のみ右辺のメソッドが実行されるようにする。
膝を抱えて座っているように見えることから「 lonely operator(ぼっち演算子)」または「safe navigation operator」などと呼ばれる。

実装したアプリ

ログイン前
・詳細ページからいいね数を見ることはできますが、いいねボタンをクリックするとログインページに飛ばされます。

Image from Gyazo

また、マイページからその人がいいねした投稿一覧ページにも飛べるようにしました。

Image from Gyazo

ログイン後
・詳細ページからいいねを押す/取り消しができます。

Image from Gyazo

実装方法と注意点

ProgateのRails10章(いいね機能の章)をやりながら個人アプリにも同じことを実装したので、興味ある方はProgateの同じ章をやってみてください。

Ruby on Rails5 | プログラミングの入門なら基礎から学べるProgate[プロゲート]

ただ、本家と(かつ私の作ったアプリとも)一つだけ大きく異なる点があります。

本家「Twitter
・ログインしていなくても投稿一覧やそれに紐づくいいね数は見ることができる

Progate「Tweetapp」
・投稿や投稿に紐づくいいね数さえログインしていないと見られないようになっている

そのため、全てProgate通りに実装すると、ログインしている状態では問題ありません。
ただし、ログアウトした状態で投稿詳細ページに飛ぼうとするとエラー「NoMethodError in Posts#show undefined method `id' for nil:NilClass」が出ます。
これは、Posts/show.html.erbにおいて、下記の記述をしていることが問題のため起きています。

<% if Like.find_by(user_id: current_user.id, post_id: @post.id) %>

ログインしていない状況のため、「current_user.id」の「id」が、likesテーブルのどのuser_idのレコードを参照すれば良いか判断がつかない状況になっているからです。
そこで、冒頭に出てきたぼっち演算子「&」を追記することでエラーが解決します。

<% if Like.find_by(user_id: current_user&.id, post_id: @post.id) %>

チーム開発2週目が終わりました 。
本日の2回目のスプリントレビューでは、毎日のスクラム報告フォームで下記の項目が全員100%であったことを評価してもらいました。

  1. チーム開発最初に決めたルールが守れていること。
  2. メンバーが時間通りにきていること。
  3. 心理的安全性が保たれていること。

メンター曰く、「技術力は高いけど変なプライドを持っている人がいるチームより、技術力は低いけど本質的に仲の良いメンバーが揃ったチームの方が良いプロダクトができるし、結果的に満足度も高くなる」とのことでした。

ただし、自分のタスクを抱え込んでしまっていたこと、自分のタスク(商品出品)が大きな部分なので優先度高く実装するべきだったことは課題として指摘もらったので、3週目は改善して行きます。