rails NoMethodError:nil的未定义方法"":NilClass

Han*_*nna 0 ruby-on-rails nomethoderror railstutorial.org

我正在研究迈克尔哈特尔的导轨教程(第9章).

我收到此错误:

 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>'
Run Code Online (Sandbox Code Playgroud)

FILL-IN在第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
Run Code Online (Sandbox Code Playgroud)

第42行是:

assert_equal assigns(:user).FILL_IN,FILL_IN
Run Code Online (Sandbox Code Playgroud)

小智 8

如果您在清单8.62中执行了"使用记忆练习登录",则需要在清单9.29中使用@user实例变量.我花了一段时间才意识到这一点,所以它可能有助于其他初学者看到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
Run Code Online (Sandbox Code Playgroud)

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

# ...
Run Code Online (Sandbox Code Playgroud)

公平地说,Michael Hartl建议我们用git解决单独主题分支中的练习.