1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

エラー解決を通してdeviseのメソッドuser_signed_in?とcurrent_userの理解が深まった話

Posted at

開発環境

Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系

事の発端

転職用のポートフォリオとしてオリジナルアプリを作っていたある日のことでした。
未ログインユーザーが詳細ページに遷移するリクエストをローカルで行ったところ、以下のエラーが発生

スクリーンショット 2021-01-18 20.02.57.png

解決法

結論から言うと  user_signed_in? &&  の条件を追加することで解決しました。

エラー時のコード

show.html.erb
<% 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 %>

エラー解決後のコード

show.html.erb
<% 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の条件は参照されません)

対策

対策としては「メソッドに対するなんとなくの理解をやめること」だと思っています。

エラーの原因としては上記の通りですけど、根本的な原因は「メソッドをなんとなく覚えて理解したつもりで使っていたこと」だと思っています。
気をつけます、、、

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?