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

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

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

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

Q&A

解決済

1回答

486閲覧

【Ruby on Rails チュートリアル 第10章】テストが通りません

pecchan

総合スコア555

Ruby on Rails

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

0グッド

1クリップ

投稿2019/07/03 08:29

編集2019/07/05 10:29

Ruby on Rails チュートリアルを勉強してます。
第10章→10.2 認可→10.17: テストユーザーでログインする green
の箇所で行き詰ってます。

テストはGreenでパスする例なのですが、テストが通りません。
nilエラーになってしまいます。
原因分かる方教えて下さい。

ちなみに、チュートリアルではモデル名は、User(ユーザー)ですが、
こちらはWorker(ワーカー)という名前に変更してます。

宜しくお願い致します。

エラーメッセージ

txt

1ERROR["test_successful_edit", WorkersEditTest, 0.5882816000003004] 2 test_successful_edit#WorkersEditTest (0.59s) 3NoMethodError: NoMethodError: undefined method `[]' for nil:NilClass 4 app/controllers/worker_sessions_controller.rb:6:in `create' 5 test/test_helper.rb:26:in `log_in_as' 6 test/integration/workers_edit_test.rb:23:in `block in <class:WorkersEditTest>' 7 8ERROR["test_unsuccessful_edit", WorkersEditTest, 0.5951644939996186] 9 test_unsuccessful_edit#WorkersEditTest (0.60s) 10NoMethodError: NoMethodError: undefined method `[]' for nil:NilClass 11 app/controllers/worker_sessions_controller.rb:6:in `create' 12 test/test_helper.rb:26:in `log_in_as' 13 test/integration/workers_edit_test.rb:9:in `block in <class:WorkersEditTest>' 14 15 26/26: [========================================] 100% Time: 00:00:00, Time: 00:00:00 16 17Finished in 0.63431s 1826 tests, 55 assertions, 0 failures, 2 errors, 0 skips

テストプログラム
/XXX/test/integration/workers_edit_test.rb

ruby

1require 'test_helper' 2 3class WorkersEditTest < ActionDispatch::IntegrationTest 4 def setup 5 @worker = workers(:michael) 6 end 7 8 test "unsuccessful edit" do 9 log_in_as(@worker) 10 get edit_worker_path(@worker) 11 assert_template 'workers/edit' 12 patch worker_path(@worker), params: { worker: { name: "", 13 email: "foo@invalid", 14 password: "foo", 15 password_confirmation: "bar" } } 16 17 assert_template 'workers/edit' 18 19 end 20 21 22 test "successful edit" do 23 log_in_as(@worker) 24 get edit_worker_path(@worker) 25 assert_template 'workers/edit' 26 name = 'Foo Bar' 27 email = "foo@bar.com" 28 patch worker_path(@worker), params: { worker: { name: name, 29 email: email, 30 password: "", 31 password_confirmation: "" } } 32 33 34 assert_not flash.empty? 35 assert_redirected_to @worker 36 @worker.reload 37 assert_equal name, @worker.name 38 assert_equal email, @worker.email 39 40 end 41 42 43 44 45 46 47end 48

テスト・ヘルパー
/XXX/test/test_helper.rb

ruby

1ENV['RAILS_ENV'] ||= 'test' 2require File.expand_path('../../config/environment', __FILE__) 3require 'rails/test_help' 4require "minitest/reporters" 5Minitest::Reporters.use! 6 7class ActiveSupport::TestCase 8 9 fixtures :all 10 11 # テストワーカーがログイン中の場合にtrueを返す 12 def is_logged_in? 13 !session[:worker_id].nil? 14 end 15 16 # テストワーカーとしてログインする 17 def log_in_as(worker) 18 session[:worker_id] = worker.id 19 end 20 21end 22 23class ActionDispatch::IntegrationTest 24 # テストワーカーとしてログインする 25 def log_in_as(worker, password: 'password', remember_me: '1') 26 post workers_login_path, params: { session: { email: worker.email, 27 password: password, 28 remember_me: remember_me } } 29 end 30end 31

コントローラ
/XXX/app/controllers/workers_controller.rb

ruby

1class WorkersController < ApplicationController 2 3 before_action :logged_in_worker, only: [:edit, :update] 4 5 def new 6 @worker = Worker.new 7 end 8 9 def show 10 @worker = Worker.find(params[:id]) 11 12 end 13 14 def create 15 @worker = Worker.new(worker_params) 16 if @worker.save 17 log_in @worker 18 redirect_to @worker 19 flash[:success] = "ようこそ!" 20 else 21 render 'new' 22 end 23 24 end 25 26 def edit 27 @worker = Worker.find(params[:id]) 28 end 29 30 def update 31 @worker = Worker.find(params[:id]) 32 if @worker.update_attributes(worker_params) 33 flash[:success] = "プロフィールを更新しました" 34 redirect_to @worker 35 else 36 render 'edit' 37 end 38 end 39 40 41 def destroy 42 43 end 44 45 46 private 47 def worker_params 48 params.require(:worker).permit(:name, :email, :password,:password_confirmation) 49 end 50 51 # ログイン済みユーザーかどうか確認 52 def logged_in_worker 53 unless logged_in? 54 flash[:danger] = "ログインしてください" 55 redirect_to workers_login_url 56 end 57 end 58 59end 60

/xxx/app/controllers/worker_sessions_controller.rb

ruby

1 2class WorkerSessionsController < ApplicationController 3 def new 4 end 5 6 def create 7 worker = Worker.find_by(email: params[:worker_session][:email].downcase) 8 if worker && worker.authenticate(params[:worker_session][:password]) 9 # ログイン後にリダイレクトする 10 log_in worker 11 params[:worker_session][:remember_me] == '1' ? remember(worker) : forget(worker) 12 redirect_to worker 13 14 else 15 # エラーメッセージを作成する 16 flash.now[:danger]="メールアドレスかパスワードが間違っています" 17 render 'new' 18 end 19 20 end 21 22 def destroy 23 log_out if logged_in? 24 redirect_to root_url 25 end 26 27end 28

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

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

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

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

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

guest

回答1

0

ベストアンサー

app/controllers/worker_sessions_controller.rb 6行目 createメソッド内で
nilに対して[]が使われています。
hash[:key]もしくはarray[idx]のような形を想定した部分でしょう。
コード実行時にnil[]になっているのでそれを修正してください。

ruby

1post workers_login_path, params: { session: { email: worker.email, password: password, remember_me: remember_me } } 2# ^^^^^^^

ruby

1worker = Worker.find_by(email: params[:worker_session][:email].downcase) 2# ^^^^^^^^^^^^^^

投稿2019/07/04 05:55

編集2019/07/07 07:58
Mugheart

総合スコア2349

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

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

pecchan

2019/07/05 10:37

有難う御座います。 worker_sessions_controller を追記しました。 [:worker_session]か、[:email]がnilということでしょうか? すいません。未だ正確な原因が分からずにいます。 と言うのは、 「worker_sessions_controller」そのものは、前章から手を加えていないのです。
pecchan

2019/07/09 03:32

こんな単純なミスとは・・・。 お恥ずかしい限りです。 有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問