【プログラミング】 (Ruby on Rails)第11章の統合テストNoMethodError: undefined method `remember_token’ for nil:NilClassの修正方法

Ruby on Railsチュートリアル第11章まで学習が進みました。

この章の冒頭で紹介されているメイラー構築作業でテストエラーが何度も発生していたため、解消方法を記載しておきます。

 

【エラー名称】

NoMethodError: undefined method `remember_token’ for nil:NilClass

 

【改善方法】

Railsチュートリアル第11章のアカウント有効化に関する統合テストにおいて、

【test/integration/users_login_test.rb】内のassigns(:user).remember_tokenに関する問題。

 

assigns(:user)でSessionControllerの@user変数を取れる一方、チュートリアル内のsessions_controller.rbに記述しているcreateに定義されているuserが@userとなっていないために発生した。

このため、SessionController#createで@userへの代入を行っていなかった為nilになってしまい、統合テストでエラーとして検出された。

 

【修正方法】

【app/controllers/sessions_controller.rb】

def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    log_in user
    params[:session][:remember_me] == '1' ? remember(user) : forget(user)
    redirect_back_or user
  else
    flash.now[:danger] = 'Invalid email/password combination'
    render 'new'
  end
end

↓
def create
  @user = User.find_by(email: params[:session][:email].downcase)
  if @user && @user.authenticate(params[:session][:password])
    log_in @user
    params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
    redirect_back_or @user
  else
    flash.now[:danger] = 'Invalid email/password combination'
    render 'new'
  end
end

sessions_controller.rb#createの記述をuserから@userに変更することでテストのパスを確認。

この記事も人気ですよ