繁体   English   中英

rails NoMethodError:nil:NilClass的未定义方法“”

[英]rails NoMethodError: undefined method “ ” for nil:NilClass

我正在研究Michael Hartl的rails教程( 第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>'

第8章中添加了FILL-IN,直到第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

如果您在清单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

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在单独的主题分支中解决练习。

错误显示assigns(:user)返回nil。

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

在这种情况下, FILL_IN是占位符。 Michael希望您将其替换为正确的文本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM