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

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

ただいまの
回答率

90.53%

Ruby on Rails 5.1 第4番 10章でグリーンになるはずのテストがREDになる

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 84
退会済みユーザー

退会済みユーザー

Ruby on Rails Tutorial Rails5.1第4番の10章でグリーンになるはずのところでエラーが出ました。
二日試しましたが同じエラーがでてテストがグリーニにならないのでご指導お願いします。

リスト 10.32: フレンドリーフォワーディングを備えたcreateアクション green
app/controllers/sessions_controller.rb

発生している問題・エラーメッセージ

rails testでの結果がエラーです。

ec2-user:~/environment/sample_app (updating-users) $ rails test
Running via Spring preloader in process 6409
Started with run options --seed 29315

ERROR["test_successful_edit_with_friendly_forwarding", UsersEditTest, 0.17372170799990272]
 test_successful_edit_with_friendly_forwarding#UsersEditTest (0.17s)
NoMethodError:         NoMethodError: undefined method `remember' for #<User:0x007fb7d4d4db70>
        Did you mean?  remember_digest
            app/helpers/sessions_helper.rb:9:in `remember'
            app/controllers/sessions_controller.rb:14:in `create'
            test/test_helper.rb:30:in `log_in_as'
            test/integration/users_edit_test.rb:22:in `block in <class:UsersEditTest>'

ERROR["test_unsuccessful_edit", UsersEditTest, 0.18923055100003694]
 test_unsuccessful_edit#UsersEditTest (0.19s)
NoMethodError:         NoMethodError: undefined method `remember' for #<User:0x007fb7d4d1cca0>
        Did you mean?  remember_digest
            app/helpers/sessions_helper.rb:9:in `remember'
            app/controllers/sessions_controller.rb:14:in `create'
            test/test_helper.rb:30:in `log_in_as'
            test/integration/users_edit_test.rb:9:in `block in <class:UsersEditTest>'

ERROR["test_login_with_valid_information_followed_by_logout", UsersLoginTest, 0.5369487369998751]
 test_login_with_valid_information_followed_by_logout#UsersLoginTest (0.54s)
NoMethodError:         NoMethodError: undefined method `forget' for #<User:0x00000006ae5848>
            app/helpers/sessions_helper.rb:15:in `forget'
            app/controllers/sessions_controller.rb:14:in `create'
            test/integration/users_login_test.rb:20:in `block in <class:UsersLoginTest>'

            test/controllers/users_controller_test.rb:55:in `block in <class:UsersControllerTest>'

ERROR["test_should_redirect_update_when_logged_in_as_wrong_user", UsersControllerTest, 0.5800055469999279]
 test_should_redirect_update_when_logged_in_as_wrong_user#UsersControllerTest (0.58s)
NoMethodError:         NoMethodError: undefined method `remember' for #<User:0x00000006c65830>
        Did you mean?  remember_digest
            app/helpers/sessions_helper.rb:9:in `remember'
            app/controllers/sessions_controller.rb:14:in `create'
            test/test_helper.rb:30:in `log_in_as'
            test/controllers/users_controller_test.rb:40:in `block in <class:UsersControllerTest>'

ERROR["test_should_redirect_edit_when_logged_in_as_wrong_user", UsersControllerTest, 0.6058221610001056]
 test_should_redirect_edit_when_logged_in_as_wrong_user#UsersControllerTest (0.61s)NoMethodError:         NoMethodError: undefined method `remember' for #<User:0x00000006d4d838>        Did you mean?  remember_digest
            app/helpers/sessions_helper.rb:9:in `remember'            app/controllers/sessions_controller.rb:14:in `create'            test/test_helper.rb:30:in `log_in_as'            test/controllers/users_controller_test.rb:33:in `block in <class:UsersControllerTest>'
  29/29: [=] 100% Time: 00:00:00, Time: 00:00:00

該当のソースコード

app/helpers/sessions_helper.rb

module SessionsHelper

  def log_in(user)
    session[:user_id] = user.id
  end


  def remember(user)
    user.remember # => DB: remember_digest
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

  def current_user?(user)
    user == current_user
  end

  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)

    elsif (user_id = cookies.signed[:user_id])
      # raise
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

  def logged_in?
    !current_user.nil?
  end


  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end


  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end


  def store_location
    session[:forwarding_url] = request.original_url if request.get?
  end
end

class SessionsController < ApplicationController

  def new
  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

  def destroy
    log_out
    redirect_to root_url
  end
end


app/controllers/sessions_controller.rb

class SessionsController < ApplicationController

  def new
  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

  def destroy
    log_out
    redirect_to root_url
  end
end


test/test_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests
  # in alphabetical order.
  fixtures :all

class ActiveSupport::TestCase
  fixtures :all

  # テストユーザーがログイン中の場合にtrueを返す
  def is_logged_in?
    !session[:user_id].nil?
  end
end

    # テストユーザーとしてログインする
  def log_in_as(user)
    session[:user_id] = user.id
  end
end
class ActionDispatch::IntegrationTest

  # テストユーザーとしてログインする
  def log_in_as(user, password: 'password', remember_me: '1')
    post login_path, params: { session: { email: user.email,
                                          password: password,
                                          remember_me: remember_me } }
  end
end


test/controllers/users_controller_test.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests
  # in alphabetical order.
  fixtures :all

class ActiveSupport::TestCase
  fixtures :all

  # テストユーザーがログイン中の場合にtrueを返す
  def is_logged_in?
    !session[:user_id].nil?
  end
end

    # テストユーザーとしてログインする
  def log_in_as(user)
    session[:user_id] = user.id
  end
end
class ActionDispatch::IntegrationTest

  # テストユーザーとしてログインする
  def log_in_as(user, password: 'password', remember_me: '1')
    post login_path, params: { session: { email: user.email,
                                          password: password,
                                          remember_me: remember_me } }
  end
end


test/integration/users_login_test.rb

試したこと

controllersに問題がありメソッドが感知されていないもしくは正しく定義されていないのかと思い全角スペースを検索しましたが検出されませんでした。
最終的にyasslab/sample_appsのリポジトリから
app/helpers/sessions_helper.rb
app/controllers/sessions_controller.rb
test/test_helper.rb
test/integration/users_edit_test.rb

の中身をコピーしてみましたが同じ内容のエラーが出ました。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

同じタグがついた質問を見る