Heroku本番環境でのエラー

# はじめに
前回の記事に続き
またHeroku本番環境でエラーが出たので、記録します。

# エラー内容
いいね機能追加し、Herokuに入ろうとすると以下の表示

![スクリーンショット 2021-08-06 18.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1699260/78a4af5f-3d0d-46e0-93f9-c09c1dc5eacf.png)

前回と同様にまずは`heroku logs --tail --app <<アプリケーション名>>`でログ確認すると

    2021-08-07T03:26:44.401836+00:00 heroku[router]: at=info method=GET path="/" 
    host=bouldering-395.herokuapp.com request_id=c039e379-8060-42fe-ae08- 
    77a73b141372 fwd="180.147.68.165" dyno=web.1 connect=1ms service=25ms 
    status=500 bytes=1827 protocol=https
    2021-08-07T03:26:44.402106+00:00 app[web.1]: F, [2021-08-07T03:26:44.402018 #4] 
    FATAL -- : [c039e379-8060-42fe-ae08-77a73b141372]
    2021-08-07T03:26:44.402107+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372] ActionView::Template::Error (undefined method `liked_by?' for 
    nil:NilClass):
    2021-08-07T03:26:44.402108+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     52:
    2021-08-07T03:26:44.402109+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     53:               <%# いいね機能 %>
    2021-08-07T03:26:44.402109+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     54:                 <div class="likes">
    2021-08-07T03:26:44.402110+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     55:                   <% if current_user.liked_by? 
    (problem.id) %>
    2021-08-07T03:26:44.402114+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     56:                     <p><%= link_to 'いいねを外す', 
    destroy_like_path(problem), method: :DELETE %><%= problem.likes.count %></p>
    2021-08-07T03:26:44.402116+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     57:                   <% else %>
    2021-08-07T03:26:44.402116+00:00 app[web.1]: [c039e379-8060-42fe-ae08- 
    77a73b141372]     58:                     <p><%= link_to 'いいね', 
    create_like_path(problem), method: :POST %><%= problem.likes.count %></p>

８行目を見ると`ActionView::Template::Error (undefined method 'liked_by?' for nil:NilClass):`とある
訳すと'liked_by?'が定義されていない

## エラー文から立てた仮説・仮説を元に実行したこと
・ローカル環境では正常に動いているので、本番環境でのみマイグレーションファイル実行されていない？
→ `heroku run rails db:migrate`　実行済だが、念のため再度実行するも状況変わらず

・Heroku環境のエラー？
→ `heroku restart` するも状況変わらず

同じようなエラーをググって探すが、だいたい上で行ったようなことをすれば直っている

## 再度ログの確認
手詰まりしたのでログ読み直してみると
'liked_by?'が定義されていない　→　'liked_by?'が定義されているクラスがない？と気づく

コードを確認してみる

     User < ApplicationRecord
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :validatable

      has_many :problems
      has_many :comments

      has_many :likes, dependent: :destroy

      validates :name, presence: true

      def liked_by?(problem_id)
        likes.where(problem_id: problem_id).exists?
      end
     end

'liked_by?'が定義されているのはuserモデル

##　改めて仮説検証
'liked_by?'が定義されていない　→　'liked_by?'が定義されているクラスがない？　→ 
**user情報がない？**　→ **ログインされていない？**と仮説を立て

`heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1`をして一度データベースの内容をリセット

→トップページ表示させることに成功！

新規登録してログ確認しても`ActionView::Template::Error (undefined method 'liked_by?' for nil:NilClass):`のエラー出なくなり解決！！

#　まとめ
今回は'liked_by?'と定義しているuser情報がないというエラーで
データベースをリセットして新規登録し直すと解決することができました。


###　追記
ケータイでもHerokuにログインしてみようと思いサイト開くと再び、同じエラーが表示

![スクリーンショット 2021-08-06 18.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1699260/78a4af5f-3d0d-46e0-93f9-c09c1dc5eacf.png)

コード確認

トップページ
app/views/problem/index.html.erb

    <% current_user.liked_by?(problem.id) %>
      <p><%= link_to 'いいねを外す', destroy_like_path(problem), method: :DELETE %> 
      <%= problem.likes.count %></p>
    <% else %>
      <p><%= link_to 'いいね', create_like_path(problem), method: :POST %><%= 
      problem.likes.count %></p>
    <% end %>

ログインしてないのに`current_user.liked_by?(problem.id)`と記述していたのがエラーの原因でした。

app/views/problem/index.html.erbに`if user_signed_in? &&`追加

    <% if user_signed_in? && current_user.liked_by?(problem.id) %>
      <p><%= link_to 'いいねを外す', destroy_like_path(problem), method: :DELETE %> 
      <%= problem.likes.count %></p>
    <% else %>
      <p><%= link_to 'いいね', create_like_path(problem), method: :POST %><%= 
      problem.likes.count %></p>
    <% end %>

コントローラーに`before_action :authenticate_user!, except: :index`追加し、ログインしてなくてもトップページ入れるようにしたことで解決しました。

app/controllers/problem_controller.rb

    class ProblemsController < ApplicationController
      before_action :authenticate_user!, except: :index

    *省略＊    

    end


間違いや改善点などありましたらご指摘お願いいたします。