2015-04-22 71 views
0

我正在使用Michael Hartl的rails教程(chapter 9)。rails NoMethodError:undefined方法“”为零:NilClass

我得到这个错误:在chapter 8加入

Error: 
UsersLoginTest#test_login_with_remembering: 
NoMethodError: undefined method `FILL_IN' for nil:NilClass 
    test/integration/users_login_test.rb:42:in `block in <class:UsersLoginTest>' 

填写及有没有,直到第9章 我尝试了很多什么问题,但我不能修复它。这是我的UsersLoginTest类。 42

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, session: { email: "", password: "" } 
    assert_template 'sessions/new' 
    assert_not flash.empty? 
    get root_path 
    assert flash.empty? 
    end 

    test "login with valid information followed by logout" do 
     get login_path 
    post login_path, 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 
    # Simulate a user clicking logout in a second window. 
    delete logout_path 
    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 

    test "login with remembering" do 
    log_in_as(@user, remember_me: '1') 
    assert_equal assigns(:user).FILL_IN, FILL_IN 
    end 

    test "login without remembering" do 
    log_in_as(@user, remember_me: '0') 
    assert_nil cookies['remember_token'] 
    end 
end 

线是:

assert_equal assigns(:user).FILL_IN,FILL_IN 

回答

1

FILL_IN在这种情况下是一个占位符。迈克尔希望你用正确的文字替换它。

2

错误表明assigns(:user)返回零。

assigns测试控制器中设置的实例变量。期望的是,您的控制器中设置的值为@user,并且调用方法FILL_IN时,它将等于FILL_IN。一旦解决了@usernil的问题,您需要实际填写这些占位符。

7

如果您在清单8.62中做了“记忆练习登录”,则需要在清单9.29中使用@user实例变量。我花了一段时间来实现这一点,所以它可能会帮助其他初学者看看沙德韦尔的建议看起来像代码:

sessions_controller.rb

class SessionsController < ApplicationController 
    # ... 

    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' # Flash.now designed for rendered pages, disappears at the next request. 
     render 'new' 
    end 
    end 

    # ... 
end 

users_login_test.rb

# ... 

test "login with remembering" do 
    log_in_as(@user, remember_me: '1') 
    assert_equal assigns(:user).remember_token, cookies['remember_token'] 
    end 

# ... 

为了公平起见,Michael Hartl建议我们用git解决单独主题分支中的练习。

相关问题