Ruby、Ruby on Railsで開発している時に起こしやすい4つのエラー
ArgumentError
エラー解決の流れ
確認する際の大きな流れは、
①でエラー内容と場所の大枠を確認。
②でエラー内容を更に詳しく知り
③④でエラー箇所を具体的に確認する。
となります。この流れを意識しておいてください。順番に確認してみます。
①Argument Error in Users#edit
Argument Error → メソッドの引数の数が合っていないときや、引数が空であるときに発生するエラーです。ここでは、引数@userが空であるためエラーが起きています。ちなみに Argumentは、「引数」という意味です。
in Users#edit → エラーの場所を「コントローラ名#アクション名」という形式で示します。具体的には、Usersコントローラのeditアクションのビューです。
②First argument in form cannot nil or be empty
この文章は①よりも具体的なエラーの内容です。今回は、
First argument in form → フォームの中にある1番目の引数(@user)が
nil or be empty → 存在していない or 空っぽ
であることを示しています。引数はコントローラから持ってきているので、ビューだけでなくコントローラにも原因があると考えます。
引数がうまく渡せていないときに考えられる具体的なエラーの例は、
・ビューに書いてある変数のスペルミス
・コントローラで変数の定義がおかしい
の2つです。
③Showing /vagrant/bookers/app/views/users/edit.html.erb where line #8 raised:
この一文は①よりも具体的なエラーの場所を示しています。
/vagrant/bookers/app/views/users/edit.html.erb は、エラーが起きているファイルのパスです。
今回は、その8行目(line #8)がエラーであることがわかります。
②で考えられたエラー内容と結びつけると、
viewでform_forに@user(スペルはコントローラと同じであるとします。)を渡していても、
コントローラで@userにUserオブジェクトが渡されていない、ということが考えられます。
したがって①〜③より、
コントローラのeditアクション内に @user = User.new と書くことでエラーを解決できると判断できます。
④実際のコード画面
④は③と対応しているコード画面です。
実際のコードで、③よりもピンポイントでエラー箇所を教えてくれています。
NoMethodError
①NoMethodError in Users#show
NoMethodError → 定義されていないメソッドが呼び出されたときに起きるエラーです。
in Users#show → Usersコントローラのshowアクションのビューでエラーが起きていることを示しています。
②Undefined method 'name_miss' for #<User:~~~>
Did you mean? name_was
この文章は①よりも具体的なエラーの内容です。今回は、
Undefined method 'name_miss' → 「name_miss」というメソッドが定義されていません。undefinedは「定義されていない」という意味です。
for #<User:~~~> → Userモデルに対して
というエラーの意味となっており、メソッドが存在しないことがエラーの原因だと考えられます。
さらに「Did you mean? name_was」があります。
これは、記述してあるメソッドがスペルミスで、name_wasではないのか?とRailsが提案しています。
これでエラーが解消されることもありますが、今回はこのまま検証を進めます。
③Showing /vagrant/bookers/app/views/users/show.erb.html where line #15 raised:
この一文は①よりも具体的なエラーの場所を示しています。
②で考えたエラー内容と結びつけると、
@userでユーザー情報を持っていても、name_missというカラムが存在しないためエラーが起きている、と考えられます。
したがって①〜③より、
・Userテーブルにname_missというカラムを追加する
・name_wasに記述し直す
以上の2つどちらかでエラーが解消できると判断できます。
SyntaxError
①SyntaxError in UsersController#show
SyntaxError → コードの中にRubyの文法エラーがあるときに発生します。Syntaxは「構文」という意味です。
in Users#show → Usersコントローラのshowアクションのビューでエラーが起きていることを示しています。
②/vagrant/bookers/app/views/users/show.html.erb:85 syntax error, unexpected end-of-input, expecting keyword_end end ^
この一文は①よりも具体的なエラーの場所・内容・解決法を示しています。
ここはそのままの日本語訳に加えて説明すると、
場所:/vagrant/bookers/app/views/users/show.html.erb:85
内容:syntax error, unexpected end-of-input, → 構文エラーで、ビューで処理の終わりを意味する<% end %>が過不足している可能性があります。
unexpectedは「予期しない」、end-of-inputは「input(ビューファイルのコードの終わり)の終わり」を意味します。
解決法:expecting keyword_end end ^ → <% end %>を追加する or 余分な<% end %>を消す。
と解決方法まで提示してあります。今回のように③の画面が真っ白や、②のエラー文が何行も出ていて読めないといった場合は今回のように些細なミスであることが多いです。
RoutingError
①Routing Error
現在のルーティングを確認しましょう。
③部分を確認するか、以下のコマンドを実行して確認します。
Routing Error → routes.rbで定義したルーティングに合わない場合に起きるエラーです。
②No route matches [GET] "/users"
今回はブラウザで、「localhost:3000/users」にアクセスしたときに、usersコントローラのindexアクションを実行したいことを前提とします。
ルーティングエラーが起こっていて、①でルーティングを確認して足りなかった場合は、
アプリケーション内の「routes.rb」ファイルに足りないルーティングの記述を追加すれば良いことがわかります。
今回の場合は、httpメソッドの「get」とurl「/users」、usersコントローラのindexアクションを結びつけたいため、
と記述することで解決します。
__________
xoxo ( `ー´)ノ