Ruby on rails 迈克尔·哈特尔’;s Rails教程第9章(第9.12节)测试失败;未定义的局部变量或方法;
我正在学习MichaelHartl的Rails教程,但在实现高级登录时,我在测试中遇到了困难(第9.12节) 到目前为止,我已经通过了所有测试,但在使用有效信息测试登录时出现了一个错误。不知何故,似乎有些东西没有被很好地定义或遗漏。 有什么帮助吗?谢谢 UserLoginTestRuby on rails 迈克尔·哈特尔’;s Rails教程第9章(第9.12节)测试失败;未定义的局部变量或方法;,ruby-on-rails,ruby,ruby-on-rails-5,railstutorial.org,Ruby On Rails,Ruby,Ruby On Rails 5,Railstutorial.org,我正在学习MichaelHartl的Rails教程,但在实现高级登录时,我在测试中遇到了困难(第9.12节) 到目前为止,我已经通过了所有测试,但在使用有效信息测试登录时出现了一个错误。不知何故,似乎有些东西没有被很好地定义或遗漏。 有什么帮助吗?谢谢 UserLoginTest require 'test_helper' class UsersLoginTest < ActionDispatch::IntegrationTest def setup @user
require 'test_helper'
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, params: {session: {email:"", password:""}}
assert_template 'sessions/new'
assert_not flash.empty?
get root_path
assert flash.empty?
end
test "login with valid information" do
get login_path
post login_path, params: { session: { email: @user.email, password: 'password' } }
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)
end
test "login with valid information followed by logout" do
get login_path
post login_path, params: { 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
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
end
结束
会话控制器
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
def remember(user)
user.remember
cookies.permanent.signed[user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def logged_in?
!current_user.nil?
end
def forget
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
redirect_to root_url
end
end
class sessioncontroller
您的测试输出表明在sessions\u helper.rb
的第18行有一个未定义的局部变量user\u id
。如果我们看一下代码中的那一行,就会看到这个方法:
def remember(user)
user.remember
cookies.permanent.signed[user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
当您尝试执行
cookies.permanent.signed[user\u id]
时,会出现错误。您可能忘记了冒号,意思是说cookies.permanent.signed[:user\u id]
。如果没有冒号,ruby认为user\u id
是一个局部变量,而不是一个符号,您看到的错误会被抛出。最好将测试输出作为文本添加到本文中-一般来说,StackOverflow上的问题应该是独立的。另外,检查输出中的堆栈跟踪!它为您提供了要查看的特定代码行,例如,sessionhelp
谢谢。就是这样。我快要发疯了。