0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

今回は課題の中で起きたエラーメッセージについて調べたことをアウトプットします。エラー一つにしても発生場所、原因は様々で、エラー表記の部分だけを直しても改善しなかったり😢
どんなエラーでも対応できるようになりたい

環境

  • 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_articlesnilであるために、any?メソッドを呼び出そうとしてエラーが発生していることを示している

nilが原因と判断できる理由

  • undefined method 'any?' for nil:NilClassから、@yesterday_articlesnilであることがわかり、nilでなければ、nil:NilClassという部分が表示されることはないから
  • any?メソッドは通常、配列やActiveRecordのリレーションなどのコレクションに対して使われるメソッドです。@yesterday_articlesnilでない場合、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_yesterdaynilでないことを確認するコードを追加する(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が欠かせません。一昔前はこんな便利な機能がない中エラー解決していたなんて…すごすぎますね

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?