テクノロジー
2017年12月24日エラーメッセージから学ぶ
今回はエラーメッセージから原因を探る方法を学んでいきましょう。 エラーメッセージが出ると落ち込む人も多いはず。しかしエラーメッセージから解決方法がわかるようになれば怖いものなしです! ぜひこの機会にその力を習得しましょう。
目次
エラーメッセージから学ぶ
よく発生するエラー
NoMethodError
NameError
SyntaxError
RoutingError
PG::ConnectionBad
ActiveRecord::NodatabaseError
ActiveRecord::RecordNotFound
ActiveRecord::PendingMigrationError
ActionView::MissingTemplete
ArgumentError
エラーメッセージから学ぶ
今回はエラーメッセージから原因を探る方法を学んでいきましょう。
エラーメッセージが出ると落ち込む人も多いはず。しかしエラーメッセージから解決方法がわかるようになれば怖いものなしです!
ぜひこの機会にその力を習得しましょう。
また下の記事も参考になるかもしれません。
エラーの原因を突き止めるためにはどうするの?
よく発生するエラー
ほとんどのエラーは、エラーメッセージ(英語)を読むと答えが書いてあったり、エラーメッセージをググることで解決できます。
また、よく発生するエラーのパターンを覚えておくと、解決までの時間を短くすることができます。
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のエラーと同じになった!
このようにエラーを再現すると理解も深まります。
例2
アソシエーションが定義されていないため @blogs.user.name
でエラーが起きている。
app/models/blog.rb
や app/models/user.rb
のアソシエーションの定義を見直しましょう。
例3
外部キーが nil
または 存在しないid
が入っているので @blogs.user.name
でエラーが起きている。
rails console
で user_id
に適切な値が入っているか確認し、もし入っていなければ適切な値を入力してみましょう。
今回はundefined method "name" nil:Class
なのでblog.userがnilを返していることがわかります。(例2ではblogのインスタンスにuserというメソッドがないというエラー)
blogとuserの紐付けがデータによって実現できていないのでblogを作成する段階の処理の見直しが必要になるかもしれません。(blogを作成するときに意図したuserのidをセットできているか確認)
NameError
定義されていない変数またはメソッドを使用したときに発生します。
NoMethodError
は定義されていないメソッドの呼び出しが行われたときに発生しますが、
NameError
は変数またはメソッドかどちらか判断がつかない時に発生します。
メソッドや変数の定義忘れやスペルミスのケースがほとんどです。
しっかり定義されているか、スペルミスがないか確認しましょう。
SyntaxError
プログラムの文法や構文などが正しくない時に発生するエラーです。
if
と end
の数があっていなかったり、 {}
の閉じ忘れがあることが多いです。
コードをしっかりと見直すことで解決することができます。
RoutingError
ルーティングの設定が正しくないときに発生するエラーです。
下記を中心に見直すと解決できるケースがほとんどです。
- config/routes.rb の設定
- link_toやrender、redirect_toの引数
PG::ConnectionBad
PostgreSQLにアクセスできないときに発生するエラーです。
PostgreSQLが起動していないというケースがほとんどなので、下記コマンドで起動しましょう。
(コンソール
)
sudo service postgresql start
ActiveRecord::NodatabaseError
データベースが存在しないときに発生するエラーです。
データベースがない状態でRailsアプリケーションを起動させようとしたり、マイグレーションしようとすると発生します。
下記コマンドで、まずはデータベースを作成しましょう。
(コンソール
)
rake db:create
ActiveRecord::RecordNotFound
存在しないレコードにアクセスしようとしたときに発生するエラーです。
findメソッドなどで呼び出そうとしているレコードの id
が存在しているかを確認しましょう。
ActiveRecord::PendingMigrationError
マイグレーションが完了していないときに発生するエラーです。
エラーメッセージの通り、下記コマンドを実行しましょう。
(コンソール
)
rake db:migrate
ActionView::MissingTemplete
呼び出そうとしているviewファイルが見つからないときに発生するエラーです。
下記を中心に確認すると解決できるケースが多いです。
- ファイル名にミスタイプはないか?
partial
やrender
の引数が正しいか?- そもそも対応したviewファイルがない
ArgumentError
メソッドの引数が正しくない時や足りない時に発生するエラーです。
wrong number of arguments (given 0, expected 1+)
というエラーメッセージが表示されています。
これは 引数の数が間違っています(現状0個です、正常な引数の数は1個以上です)
という意味です。
つまり form_for
のメソッドの引数が足りないために起こっているエラーだということが分かります。
メソッドのリファレンス(http://railsdoc.com/)を見ながら、正しい引数が設定されいるかを確認し修正すると解決できることが多いです。
冒頭にもあるように、エラーメッセージは原因をある程度特定してくれています。英語だからといって拒否をせず、エラーメッセージを読み解く努力をするクセをつけましょう。