はじめに
前回の記事に続き
またHeroku本番環境でエラーが出たので、記録します。
エラー内容
いいね機能追加し、Herokuに入ろうとすると以下の表示
前回と同様にまずは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>
8行目を見ると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にログインしてみようと思いサイト開くと再び、同じエラーが表示
コード確認
トップページ
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
間違いや改善点などありましたらご指摘お願いいたします。