⌨️

【Rails】記述は合ってるのにNameError?

2024/01/15に公開

はじめに

サーバー起動し新規投稿作成画面を開こうとしたらエラー発生。
投稿に関わるところ特にいじった覚えないのになんでだ?と思い、ひとつずつ確認してみたところ、原因はモデルの最終行に打ってしまっていた全角スペースでした。

環境

  • OS: Windows
  • IDE: Cloud9
  • Ruby-3.1.2
  • Rails 6.1.7.6

何が起きていたのか

通知機能を実装するためモデルやビューなどいくつかファイルを触り、動作確認しようとサーバーを起動して新規投稿画面へ飛んだところ、エラーが発生。

エラー内容

今回発生したエラーはこちら。
error image

このエラーはプログラムの中で使用しようとしている変数またはメソッドが未定義である場合に発生する。
エラーメッセージを見ると、new.html.erbファイルの29行目で発生したエラーを表示。6行目付近のコードで未定義のローカル変数またはメソッドが使われているよ。とのこと。しかしこれだけでは具体的にどれが未定義なのか分からない。

投稿機能について特に触った記憶もなかったのでなぜだろうと思いながらも、とりあえずviews/new.html.erbの29行目と、コードが表示されていたmodels/post_tag_relation.rbの6行目を確認してみた。

原因

app/models/post_tag_relation.rbの 6 行目に全角スペースを発見。

app/models/post_tag_relation.rb
3   belongs_to :post
4   belongs_to :tag
5 end
6 ␣←ここに全角スペースが

他の機能を実装する際、モデルに順に記述していく中で入ってしまったのだろう。
もしやと思いスペースを削除して再度ロードしてみると無事エラーは解決。

行末のスペースがなぜ未定義のエラーに?

一般的にはスペースやタブは特別な意味を持たない。ただしプログラミング言語やフレームワークには特定の文法や構造があり、それに基づいてコードを解釈する。つまり空白の位置や数によってはコードを解釈する際に重要な役割を果たす場合があるのだ。

プログラミング言語ではスペースを意味の一部として扱う。特にRubyやRuby on Railsのような言語、フレームワークではスペースやインデントがコードの意味を決定することもあり、空白の追加や削除によってはプログラムが正常に動作しなくなることがある。それはつまりスペースが入ることでその構文や文法が崩れてしまう可能性があるということ。

例えばRubyではメソッド呼び出しや変数の代入などの際、メソッド名や変数名の後ろにスペースを入れることができる。ということは、スペースの追加や削除によってプログラムの意味が変わり、結果としてエラーが発生することがあるというのは想像に難くない。

今回のケースでは行末に不要な全角スペースが入力されていた。そのスペースもコードの一部として扱われ、コード内の変数やメソッドとして解釈しようとしたことで未定義のエラーが発生した。というのがエラーにつながった理由だと言えるだろう。

プログラミング言語やフレームワークでは文字だけでなくスペースも正確に区別する。そのためスペースやインデントにも十分に注意を払う必要があるのだと強く実感した。

余談

◇ ブラウザとターミナルでエラーメッセージが違う?

エラーが発生した際、ブラウザとターミナルで異なるエラーメッセージが表示されることがある。今回であれば、ブラウザに表示されたエラーはNameError in Public::Posts#newでありモデルの記述が表示されていたが、ターミナルを確認してみるとActionView::Template::Error (undefined local variable or method ` ' for main:Object):となっており、ビューの記述が表示されていた。
これは表示するエラーの目的やターゲットが異なるためである。

● ブラウザに表示されるエラー

サーバーを起動して画面に表示されるエラーはブラウザ上のエラーページ。これは、"ユーザー向け"にエラーメッセージやエラーの詳細をわかりやすく表示するために設計されている。例えば特定のビューファイルが見つからなかった場合や変数が未定義だった場合など、利用者が理解しやすい形でエラー内容が表示される。

● ターミナルに表示されるエラー

一方こちらは"開発者向け"のデバッグ情報を提供するためのもの。アプリケーションの実行中に発生した具体的なエラーの情報が表示される。ターミナルに表示されるエラーメッセージは、開発者が問題を特定しデバッグを行うために参考にするためのものとなっている。

つまりブラウザとターミナルでエラーメッセージが異なる場合があるのは、ブラウザのエラーページはユーザー向け、ターミナルのエラーメッセージは開発者向けと、それぞれ違った役割を果たしているためである。


以前どこかの記事で見かけた、エラーの原因がスペースだったという内容をふと思い出し、今回のエラーでは余分なスペースの可能性を疑いましたが、その情報がなければ空白を見逃してしまい原因にたどり着けなかったかもしれません。スペース一つにも意味があるとはおもしろいものです。
これからも多くの記事に触れ、可能性の引き出しを増やし続けたいと思います。

最後まで読んでいただきありがとうございました。
DWCでプログラミング学習を始めて3カ月目に入りました。新しい情報はどんどんキャッチしていきたいので、プラスの情報や修正点等ありましたらご連絡いただけますと幸いです。

Discussion