はじめに
今回は課題の中で起きたエラーメッセージについて調べたことをアウトプットします。エラー一つにしても発生場所、原因は様々で、エラー表記の部分だけを直しても改善しなかったり😢
どんなエラーでも対応できるようになりたい
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
エラー内容
Failure/Error:
<% if @yesterday_articles.any? %>
ActionView::Template::Error:
undefined method any?' for nil:NilClass
私はこのエラー文を見た時「any?メソッドが定義されていないエラー」だと勘違いしていました。こんな誤った見方をしない為にも、少しずつかみ砕いていきたいと思います
1. エラーの発生場所
<% if @yesterday_articles.any? %>
-
@yesterday_articles
という変数に対してany?
メソッドを呼び出そうとしている
2. エラーの内容
undefined method `any?' for nil:NilClass
-
undefined method 'any?'
という部分はany?
メソッドが存在しないオブジェクトに対して呼び出されていることを示している -
for nil:NilClass
という部分は、nil
クラス(NilClass)に対してany?
メソッドを呼び出そうとしたことを示している - つまり、変数
@yesterday_articles
がnil
であるために、any?
メソッドを呼び出そうとしてエラーが発生していることを示している
nilが原因と判断できる理由
-
undefined method 'any?' for nil:NilClass
から、@yesterday_articles
がnil
であることがわかり、nil
でなければ、nil:NilClass
という部分が表示されることはないから -
any?
メソッドは通常、配列やActiveRecordのリレーションなどのコレクションに対して使われるメソッドです。@yesterday_articles
がnil
でない場合、any?
メソッドが呼び出せるはず
解決方法
1. インスタンス変数の初期化を確認
ArticleMailer#report_summary メソッド内で @articles_published_yesterday
を正しく初期化しているか確認
class ArticleMailer < ApplicationMailer
def report_summary
@total_published_articles = Article.published.count
@articles_published_yesterday = Article.published_yesterday
mail(to: 'admin@example.com', subject: '公開済記事の集計結果')
end
end
2. ビューでのエラーハンドリングを追加
ビュー内で@articles_published_yesterday
がnil
でないことを確認するコードを追加する(app/views/article_mailer/report_summary.text.erb)
present?
メソッドを使うことで、変数がnil
かどうかをチェックする
公開済の記事数: <%= @total_published_articles %>件
<% if @articles_published_yesterday.present? %>
<% if @articles_published_yesterday.any? %>
昨日公開された記事数: <%= @articles_published_yesterday.count %>件
<% @articles_published_yesterday.each do |article| %>
タイトル: <%= article.title %>
<% end %>
<% else %>
昨日公開された記事はありません
<% end %>
<% else %>
昨日公開された記事はありません
<% end %>
さいごに
今回のエラーについては解決方法2を行うことで解決しました。よかった。英語の翻訳と少し違ってみえるエラーの文章。毎回ChatGPTが欠かせません。一昔前はこんな便利な機能がない中エラー解決していたなんて…すごすぎますね