開発環境
Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系
事の発端
転職用のポートフォリオとしてオリジナルアプリを作っていたある日のことでした。
未ログインユーザーが詳細ページに遷移するリクエストをローカルで行ったところ、以下のエラーが発生
解決法
結論から言うと user_signed_in? && の条件を追加することで解決しました。
エラー時のコード
<% if current_user.id == @post.user.id %>
<div class = "btn-contents">
<%= link_to '編集する', edit_post_path(@post.id), class: "edit-btn"%>
<%= link_to '削除する', "#", class: "delete-btn"%>
</div>
<% end %>
エラー解決後のコード
<% if user_signed_in? && current_user.id == @post.user.id %>
<div class = "btn-contents">
<%= link_to '編集する', edit_post_path(@post.id), class: "edit-btn"%>
<%= link_to '削除する', "#", class: "delete-btn"%>
</div>
<% end %>
なんとも呆気ない話でしたね。
原因
未ログインユーザーに対する条件を忘れたことで、current_userメソッドが未ログインユーザーのリクエストの際でも使われてしまったことが原因でした。
current_userは、現在ログインしているユーザーの情報を取得できるメソッドですが、今回の場合、ログインしていないのに、ログイン情報を取得しようとしました。
そのため、「current_user??? そもそもログインしてないんでそんな情報ないんですけど???」みたいな感じでrails先生に怒られてしまったと言うわけですね。
なので、まずは手前の条件で user_signed_in?メソッドを使うことで、ログインしていなければfalseが返ってくるようにします。
そうすれば、未ログイン時には後ろの条件に遷移しなくなるのでエラーが解決するわけでした。(A && B と言う記述は、Aの条件がfalseだった場合、Bの条件は参照されません)
対策
対策としては「メソッドに対するなんとなくの理解をやめること」だと思っています。
エラーの原因としては上記の通りですけど、根本的な原因は「メソッドをなんとなく覚えて理解したつもりで使っていたこと」だと思っています。
気をつけます、、、