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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails

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

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

1348閲覧

NoMethodError: undefined method `メソッド名' for nil:NilClassの対処法を教えてほしい。

yuya-2002

総合スコア18

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails

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

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2020/06/29 06:04

解決したいこと

rails tutorial10章で10.4.3 ユーザー削除のテストを実装して、テストをしてみたところ下記のエラーが出てきて、対処方法を知りたい。

ec2

1Running via Spring preloader in process 3777 2Run options: --seed 40217 3 4# Running: 5 6..................................EE. 7 8Finished in 1.692131s, 21.8659 runs/s, 70.3255 assertions/s. 9 10 1) Error: 11UsersIndexTest#test_index_as_non-admin: 12NoMethodError: undefined method `email' for nil:NilClass 13 test/test_helper.rb:24:in `log_in_as' 14 test/integration/users_index_test.rb:36:in `block in <class:UsersIndexTest>' 15 16 2) Error: 17UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links: 18NoMethodError: undefined method `email' for nil:NilClass 19 test/test_helper.rb:24:in `log_in_as' 20 test/integration/users_index_test.rb:19:in `block in <class:UsersIndexTest>' 21 2237 runs, 119 assertions, 0 failures, 2 errors, 0 skips 23

また、NoMethodError: undefined method `メソッド名' for nil:NilClassというエラーはスペルミスかレシバーがnilというパターンがあり、もしレシバーがnilがエラー原因の時に皆さんが良く行う対処方法を教えて頂きたいです。

関連ファイル

test/test.helper.rb

ENV['RAILS_ENV']

1require File.expand_path('../../config/environment', __FILE__) 2require 'rails/test_help' 3 4class ActiveSupport::TestCase 5 # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 6 fixtures :all 7 8 # テストユーザーがログイン中の場合にtrueを返す 9 def is_logged_in? 10 !session[:user_id].nil? 11 end 12 13 # テストユーザーとしてログインする 14 def log_in_as(user) 15 session[:user_id] = user.id 16 end 17end 18 19class ActionDispatch::IntegrationTest 20 21 # テストユーザーとしてログインする 22 def log_in_as(user, password: 'password', remember_me: '1') 23 post login_path, params: { session: { email: user.email, 24 password: password, 25 remember_me: remember_me } } 26 end 27end

test/integration/users_index_test.rb

require

1 2class UsersIndexTest < ActionDispatch::IntegrationTest 3 def setup 4 @user = users(:michael) 5 end 6 7 test "index including pagination" do 8 log_in_as(@user) 9 get users_path 10 assert_template 'users/index' 11 assert_select 'div.pagination' 12 User.paginate(page: 1).each do |user| 13 assert_select 'a[href=?]', user_path(user), text: user.name 14 end 15 end 16 17 test "index as admin including pagination and delete links" do 18 log_in_as(@admin) 19 get users_path 20 assert_template 'users/index' 21 assert_select 'div.pagination' 22 first_page_of_users = User.paginate(page: 1) 23 first_page_of_users.each do |user| 24 assert_select 'a[href=?]', user_path(user), text: user.name 25 unless user == @admin 26 assert_select 'a[href=?]', user_path(user), text: 'delete' 27 end 28 end 29 assert_difference 'User.count', -1 do 30 delete user_path(@non_admin) 31 end 32 end 33 34 test "index as non-admin" do 35 log_in_as(@non_admin) 36 get users_path 37 assert_select 'a', text: 'delete', count: 0 38 end 39end

controllers/user_contoller.rb

class

1 before_action :logged_in_user, only: [:index, :edit, :update, :destroy] 2 before_action :correct_user, only: [:edit, :update] 3 before_action :admin_user, only: :destroy 4 5 def index 6 @users =User.paginate(page: params[:page]) 7 end 8 9 def show 10 @user = User.find(params[:id]) 11 end 12 13 def new 14 @user = User.new 15 end 16 17 def create 18 @user = User.new(user_params) 19 if @user.save 20 log_in @user 21 flash[:success] = "Welcome to the Sample App!" 22 redirect_to @user 23 else 24 render 'new' 25 end 26 end 27 28 def edit 29 @user = User.find(params[:id]) 30 end 31 32 def update 33 @user = User.find(params[:id]) 34 if @user.update_attributes(user_params) 35 flash[:success] = "Profile updated" 36 redirect_to @user 37 else 38 render 'edit' 39 end 40 end 41 42 def destroy 43 User.find(params[:id]).destroy 44 flash[:success] = "User deleted" 45 redirect_to users_url 46 end 47 48 private 49 50 def user_params 51 params.require(:user).permit(:name, :email, :password, 52 :password_confirmation) 53 end 54 55 # beforeアクション 56 57 # ログイン済みユーザーかどうか確認 58 def logged_in_user 59 unless logged_in? 60 store_location 61 flash[:danger] = "Please log in." 62 redirect_to login_url 63 end 64 end 65 66 # 正しいユーザーかどうか確認 67 def correct_user 68 @user = User.find(params[:id]) 69 redirect_to(root_url) unless current_user?(@user) 70 end 71 72 # 管理者かどうか確認 73 def admin_user 74 redirect_to(root_url) unless current_user.admin? 75 end 76 77end

使用しているツール

AWS、cloud9、rails5.1.2

初心者なのでエラー箇所の見るべきコードが分かっても、どう実装すればいいかまでは理解できていません。
どうか、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが出た場合、どの行でエラーが出たかを特定しバックトレースを辿り
どの変数・返り値がnilになっているのかを確認します。

今回でしたらまずいちばん深い部分

test/test_helper.rb:24:in `log_in_as'
def log_in_as(user, password: 'password', remember_me: '1')
post login_path, params: { session: { email: user.email,
password: password,
remember_me: remember_me } }

に注目します。
それを呼び出している部分は

test/integration/users_index_test.rb:36:in `block in <class:UsersIndexTest>' log_in_as(@non_admin)

どうやら、この@non_adminnilになっているのが問題のようです。

よってsetupメソッド等で@admin @non_adminを割り当ててやれば解決するはずです。
そのことに注意してよく提示されているソースをお読みください

投稿2020/06/29 07:16

編集2020/06/29 07:20
asm

総合スコア15149

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

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

asm

2020/06/29 07:25

なお、test/fixtures/users.ymlの michaelをadmin archerをnon_adminに名前変更してやると 勝手に@admin, @non_adminが作られるという機能も存在するのがRailsの難しいところ
yuya-2002

2020/06/30 01:49

そうなんですね! ご教示いただいた事で自分でエラーを解決できるように頑張ります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問