テクノロジー

2017年12月24日

エラーメッセージから学ぶ

今回はエラーメッセージから原因を探る方法を学んでいきましょう。 エラーメッセージが出ると落ち込む人も多いはず。しかしエラーメッセージから解決方法がわかるようになれば怖いものなしです! ぜひこの機会にその力を習得しましょう。

エラーメッセージから学ぶ

今回はエラーメッセージから原因を探る方法を学んでいきましょう。
エラーメッセージが出ると落ち込む人も多いはず。しかしエラーメッセージから解決方法がわかるようになれば怖いものなしです!
ぜひこの機会にその力を習得しましょう。
また下の記事も参考になるかもしれません。
エラーの原因を突き止めるためにはどうするの?

よく発生するエラー

ほとんどのエラーは、エラーメッセージ(英語)を読むと答えが書いてあったり、エラーメッセージをググることで解決できます。
また、よく発生するエラーのパターンを覚えておくと、解決までの時間を短くすることができます。

NoMethodError

定義されていないメソッドの呼び出しが行われたときに発生します。
よくある間違いとしては下記のようなものがあります。

例1
@blogs.each do |blog|@blog.each do |blog| になっている。
スペルミスがないか見直しましょう。
今回の場合は@blogsがコントローラに定義されているもののviewにおいてどこにも定義していない@blog(単数形になっています)を使っているのでeachに対して’nil’で呼び出しているのが問題のようです。試しにrails console でテストしてみます。

nil.each <= nilに対してeachメソッドを実行
NoMethodError: undefined method `each' for nil:NilClass <= 結果がrailsのエラーと同じになった!

このようにエラーを再現すると理解も深まります。

https://diveintocode.gyazo.com/77a6c9bafac22b1411866eec97819597

例2
アソシエーションが定義されていないため @blogs.user.name でエラーが起きている。
app/models/blog.rbapp/models/user.rb のアソシエーションの定義を見直しましょう。

https://diveintocode.gyazo.com/f8514b8fd4c96e03ba83d4d6e06f22ed

例3
外部キーが nil または 存在しないid が入っているので @blogs.user.name でエラーが起きている。
rails consoleuser_id に適切な値が入っているか確認し、もし入っていなければ適切な値を入力してみましょう。
今回はundefined method "name" nil:Classなのでblog.userがnilを返していることがわかります。(例2ではblogのインスタンスにuserというメソッドがないというエラー)
blogとuserの紐付けがデータによって実現できていないのでblogを作成する段階の処理の見直しが必要になるかもしれません。(blogを作成するときに意図したuserのidをセットできているか確認)

https://diveintocode.gyazo.com/db56f530636f740c02e4d20f7df4a120

NameError

https://diveintocode.gyazo.com/bdc253c53bac09d2da1fa4f47939f103

定義されていない変数またはメソッドを使用したときに発生します。
NoMethodError は定義されていないメソッドの呼び出しが行われたときに発生しますが、
NameError は変数またはメソッドかどちらか判断がつかない時に発生します。

メソッドや変数の定義忘れやスペルミスのケースがほとんどです。
しっかり定義されているか、スペルミスがないか確認しましょう。

SyntaxError

https://diveintocode.gyazo.com/2124dab44a65686652e4109a3bb65334

プログラムの文法や構文などが正しくない時に発生するエラーです。

ifend の数があっていなかったり、 {} の閉じ忘れがあることが多いです。
コードをしっかりと見直すことで解決することができます。

RoutingError

https://diveintocode.gyazo.com/56c5e42375d5b1df4dafa3958d184e18

ルーティングの設定が正しくないときに発生するエラーです。
下記を中心に見直すと解決できるケースがほとんどです。

  • config/routes.rb の設定
  • link_toやrender、redirect_toの引数

PG::ConnectionBad

https://diveintocode.gyazo.com/73c0d3e55332b3bab2d459cb65400c47

PostgreSQLにアクセスできないときに発生するエラーです。
PostgreSQLが起動していないというケースがほとんどなので、下記コマンドで起動しましょう。

(コンソール)

sudo service postgresql start

ActiveRecord::NodatabaseError

https://diveintocode.gyazo.com/e2f13c3331dfd6e48cc960b513b9fcfc

データベースが存在しないときに発生するエラーです。
データベースがない状態でRailsアプリケーションを起動させようとしたり、マイグレーションしようとすると発生します。

下記コマンドで、まずはデータベースを作成しましょう。

(コンソール)

rake db:create

ActiveRecord::RecordNotFound

https://diveintocode.gyazo.com/9f8c8fef2193244552cb84ecfa447d09

存在しないレコードにアクセスしようとしたときに発生するエラーです。

findメソッドなどで呼び出そうとしているレコードの id が存在しているかを確認しましょう。

ActiveRecord::PendingMigrationError

https://diveintocode.gyazo.com/f35e4e5a2dbc4d3c663ddea101227231

マイグレーションが完了していないときに発生するエラーです。
エラーメッセージの通り、下記コマンドを実行しましょう。

(コンソール)

rake db:migrate

ActionView::MissingTemplete

https://diveintocode.gyazo.com/da6e4c24498bd02e97353a60fbb2187d

呼び出そうとしているviewファイルが見つからないときに発生するエラーです。

下記を中心に確認すると解決できるケースが多いです。

  • ファイル名にミスタイプはないか?
  • partialrenderの引数が正しいか?
  • そもそも対応したviewファイルがない

ArgumentError

https://diveintocode.gyazo.com/00088a7d1afa2ba2f51af8d09c9dace8

メソッドの引数が正しくない時や足りない時に発生するエラーです。

wrong number of arguments (given 0, expected 1+) というエラーメッセージが表示されています。
これは 引数の数が間違っています(現状0個です、正常な引数の数は1個以上です) という意味です。
つまり form_for のメソッドの引数が足りないために起こっているエラーだということが分かります。

メソッドのリファレンス(http://railsdoc.com/)を見ながら、正しい引数が設定されいるかを確認し修正すると解決できることが多いです。

冒頭にもあるように、エラーメッセージは原因をある程度特定してくれています。英語だからといって拒否をせず、エラーメッセージを読み解く努力をするクセをつけましょう。

ダイビックのことをもっと知ってみませんか?