Qiita初投稿です。宜しくお願いします。
今回は、NoMethodErrorの解決にかなりの時間を費やしてしまったので、紹介していこうと思います。
エラー文
NoMethodError (undefined method `log_in' for ~~~~~)
原因
ApplicationコントローラにSessionヘルパーモジュールを読み込む際に、
helloメソッドに書き込んでしまっていたので、正常に動作していなかった。
正)
class ApplicationController < ActionController::Base
include SessionsHelper
end
誤)
class ApplicationController < ActionController::Base
def hello
include SessionsHelper
end
end
解決するまでの過程
エラーを見る限り、メソッドがないということなのでlog_inメソッドが定義されているかを確認した。
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
end
log_inメソッドは定義されていることを確認してから、よく分からなくなってしまい、詰まってしまった。その後は、そもそもメソッドとは何か?をRuby on Rails ガイドで調べることに。
Railsのコントローラは、ApplicationControllerを継承したRubyのクラスであり、他の>クラスと同様のメソッドが使えます。アプリケーションがブラウザからのリクエストを受け取ると、ル>ーティングによってコントローラとアクションが指名され、Railsはそれに応じてコントローラのイ>ンスタンスを生成し、アクション名と同じ名前のメソッドを実行します。
振り返りつつ、チュートリアルに沿ってもう一度確認していると、何故かSessionヘルパーモジュールがhelloメソッドの中にあるのに気がついた。
感想
エラーを出すと、どうしても視野が狭くなってしまい、普段気付けることに気付きにくくなってしまう。今回のことを生かして、次からは、少し離れたところから見るつもりで、冷静に対処していきたい。