Ruby on rails 迈克尔·哈特尔’;s Rails教程第9章(第9.12节)测试失败;未定义的局部变量或方法;

Ruby 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

我正在学习MichaelHartl的Rails教程,但在实现高级登录时,我在测试中遇到了困难(第9.12节)

到目前为止,我已经通过了所有测试,但在使用有效信息测试登录时出现了一个错误。不知何故,似乎有些东西没有被很好地定义或遗漏。 有什么帮助吗?谢谢

UserLoginTest

    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
谢谢。就是这样。我快要发疯了。