質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

0回答

1199閲覧

railsで undefined method `empty?' for nil:NilClassエラーが解決できません...助けてください...

k_yusuke

総合スコア19

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

2クリップ

投稿2019/07/18 02:52

前提・実現したいこと

rails でrails tutorialに沿って統合テストを書いていたところNoMethodError: undefined method `empty?' for nil:NilClassというエラーが検出されました。
元のオブジェクトをたどって解決しようと試みたのですが、そもそも'empty?'というメソッドの記述がないので、どこを確認していいかわからず、手詰まり状態です。
助けていただけるとありがたいです。お願いします。

該当のソースコード

Error:
UsersLoginTest#test_login_with_valid_information_followed_by_logout:
NoMethodError: undefined method `empty?' for nil:NilClass

integration/users_login_test.rb

1 test "login with valid information followed by logout" do 2 get login_path 3 post login_path, params: { session: { email: @user.email, 4 password: 'password' } } 5 assert is_logged_in? 6 assert_redirected_to @user 7 follow_redirect! 8 assert_template 'users/show' 9 assert_select "a[href=?]", login_path, count: 0 10 assert_select "a[href=?]", logout_path 11 assert_select "a[href=?]", user_path(@user) 12 delete logout_path 13 assert_not is_logged_in? 14 assert_redirected_to root_url 15 follow_redirect! 16 assert_select "a[href=?]", login_path 17 assert_select "a[href=?]", logout_path, count: 0 18 assert_select "a[href=?]", user_path(@user), count: 0 19 end

試したこと

binding.pryによるデバッグ
↓の記事も参考にしました
https://teratail.com/questions/74989
ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

cloud9使用
Rails 5.0.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urbainleverrier

2019/07/18 03:34

私もこのデバッグ方法を知りたいのですが、おそらくlogin_pathの行き先でnilになっているモデルがあるんじゃないかなと思います。 assert is_logged_in?以下をコメントアウトして同じエラーになるならそうだと思います。 モデルでemptyを使っているなら分かりやすいですが、最悪の場合、内部でエラーが起きている可能性があるので、エラーが起きそうな箇所をデバッグしていくしかないのかなと思っています。 もしくは、nilになりそうな場所をifで予め判定させておくといった具合でしょうか。
suama

2019/07/18 14:57

NoMethodError: undefined method `empty?' for nil:NilClass のメッセージとともに、行番号は出ていませんか? その前後で、tktktさんの書かれているとおり、テストのファイルではなくてコントローラ側のファイルとかが起因してエラーになっているかと思います。 ちなみにempty? はrubyの標準のメソッドになります。 Railsチュートリアルも、対象のバージョンによって差異があるので、お手元では5.0系で動かしているけど参照しているチュートリアルは5.1向け、といったことはないでしょうか? 以下のトピックあたりも関連するかなと思います。 https://teratail.com/questions/170129
k_yusuke

2019/07/19 03:41

回答ありがとうございます。返信が遅くなってしまい申し訳ございません。 >tktkt様  >assert is_logged_in?以下をコメントアウトして同じエラーになるならそうだと思います。 こちらの手法で確認したのですが、どうやらlogin_pathの行き先でUserインスタンスが空になってしまっていたようです。無事解決できました!tktkt様のifをかませて判定する方法や、コメントアウトして判定する方法はとても勉強になりました。ありがとうございます! >suama様 ・行番号なんですが、まったく別のファイルを指していたようなので省略してしまったのですが、今思えばそこにヒントがあったんではないかと思っています。情報不足でした。 ・suama様のおっしゃる通り、Usersコントローラでの記述に間違いがありました。ありがとうございます。  ・railsチュートリアルのバージョン探してみたのですが、現時点では確認できませんでした。引き続き調べてみます ・トピック確認しました。トピック内の3項演算子が少し難解だったので調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問