[英]Rails4: NoMethodError / undefined method `*' for 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
。 解决了@user
为nil
的问题后,您实际上需要填写这些占位符。
在这种情况下, FILL_IN
是占位符。 Michael希望您将其替换为正确的文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.