0
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.

Heroku本番環境でのエラー

Posted at

はじめに

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

エラー内容

いいね機能追加し、Herokuに入ろうとすると以下の表示

スクリーンショット 2021-08-06 18.11.01.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>

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にログインしてみようと思いサイト開くと再び、同じエラーが表示

スクリーンショット 2021-08-06 18.11.01.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

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

0
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
0
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?