2017-01-02 12 views
0

私はMichael Hartl's Railsチュートリアルを行っていますが、高度なログを実装するとテストに就きました(9.12節)。Michael Hartl's Railsチュートリアル9章(9.12節)のテストで "未定義のローカル変数またはメソッド"が失敗しました

これまでのところすべてのテストに合格しましたが、有効な情報でログインをテストするとエラーが発生します。どういうわけか、何かが明確に定義されていないか、見当たりません。 助けてください?おかげ

Test output

UserLoginTest

require 'test_helper' 

class UsersLoginTest < ActionDispatch::IntegrationTest 

    def setup 
    @user = users(:michael) 
    end 

    test "login with invalid information" do 
    get login_path 
    assert_template 'sessions/new' 
    post login_path, params: {session: {email:"", password:""}} 
    assert_template 'sessions/new' 
    assert_not flash.empty? 
    get root_path 
    assert flash.empty? 
    end 

    test "login with valid information" do 
    get login_path 
    post login_path, params: { session: { email: @user.email, password: 'password' } } 
    assert_redirected_to @user 
    follow_redirect! 
    assert_template 'users/show' 
    assert_select "a[href=?]", login_path, count: 0 
    assert_select "a[href=?]", logout_path 
    assert_select "a[href=?]", user_path(@user) 
    end 

    test "login with valid information followed by logout" do 
    get login_path 
    post login_path, params: { session: { email: @user.email, password: 'password' } } 
    assert is_logged_in? 
    assert_redirected_to @user 
    follow_redirect! 
    assert_template 'users/show' 
    assert_select "a[href=?]", login_path, count: 0 
    assert_select "a[href=?]", logout_path 
    assert_select "a[href=?]", user_path(@user) 
    delete logout_path 
    assert_not is_logged_in? 
    assert_redirected_to root_url 
    follow_redirect! 
    assert_select "a[href=?]", login_path 
    assert_select "a[href=?]", logout_path,  count: 0 
    assert_select "a[href=?]", user_path(@user), count: 0 
    end 

end 

SessionsHelper

module SessionsHelper 
def log_in(user) 
    session[:user_id] = user.id 
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]) 
    user = User.find_by(id: user_id) 
    if user && user.authenticated?(cookies[:remember_token]) 
    log_in user 
    @current_user = user 
    end 
    end 
end 
def remember(user) 
    user.remember 
    cookies.permanent.signed[user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
end 
def logged_in? 
    !current_user.nil? 
end 
def forget 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
end 
def log_out 
    forget(current_user) 
    session.delete(:user_id) 
    @current_user = nil 
end 

エンド SessionsController

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 
     remember user 
     redirect_to user 
    else 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    log_out 
    redirect_to root_url 
    end 

end 
+0

この投稿にテスト出力を追加するとよいでしょう。一般的に質問はStackOverflowに自己完結型でなければなりません。また、出力のスタックトレースをチェックアウトしてください!たとえば、 'SessionsHelper'の18行目を見てください。 – JKillian

答えて

0

あなたのテスト出力には、sessions_helper.rbの18行目に未定義のローカル変数user_idがあると表示されます。

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

あなたがcookies.permanent.signed[user_id]をやろうどこにエラーが発生します。私たちは、コードでその線を中心に見てみるならば、我々はこの方法を参照してください。あなたはたぶんコロンを忘れて、cookies.permanent.signed[:user_id]と言っていたでしょう。コロンがなければ、rubyはuser_idがシンボルではなくローカル変数であり、あなたが見ているエラーがスローされたと思います。

+0

ありがとうございます。それはちょうどこれでした。私は夢中になっていた。 –

関連する問題