2015-04-22 5 views
0

Я работаю над руководством по рельсам Michael Hartl's (chapter 9).рельсы NoMethodError: undefined method "" for nil: NilClass

Я получаю эту ошибку:

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>' 

FILL-IN был добавлен в chapter 8 и не было никаких проблем до главы 9. Я пробовал много, но я не могу это исправить. Вот мой класс UsersLoginTest.

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 

Линия 42:

assert_equal assigns(:user).FILL_IN,FILL_IN 

ответ

1

FILL_IN в этом случае является заполнителем. Майкл ожидает, что вы замените это на правильный текст.

2

Ошибки показывают, что assigns(:user) возвращает ноль.

assigns тесты для переменной экземпляра, установленной в вашем контроллере. Ожидание здесь в том, что у вас есть значение, заданное для @user в вашем контроллере, и что когда на него вызывается метод FILL_IN, он будет равен FILL_IN. Как только вы устранили проблему @user, которая находится в nil, вам нужно будет заполнить эти заполнители.

7

В листинге 8.62 вам необходимо использовать переменную экземпляра @user в списке 9.29, если вы выполнили «логин с запоминанием». Это мне потребовалось некоторое время, чтобы понять это, так что это может помочь другим начинающим, чтобы увидеть, какие предложения Shadwell выглядят как в коде:

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 

# ... 

Чтобы быть справедливым, Майкл Хартл советует нам решать упражнения в отдельных ветках темы с git.