Ruby on rails 迈克尔·哈特尔’;s Rails教程第9章(第9.2.3节友好转发)测试失败

Ruby on rails 迈克尔·哈特尔’;s Rails教程第9章(第9.2.3节友好转发)测试失败,ruby-on-rails,ruby,Ruby On Rails,Ruby,我是编程新手,在尝试阅读Rails教程的第9章时遇到以下错误。我检查了几次代码,但仍然不明白为什么没有定义局部变量或方法。每次重写代码时,我都会遇到类似的错误:未定义的局部变量或方法“current_user” 错误: ERROR["test_layout_links", SiteLayoutTest, 0.888518] test_layout_links#SiteLayoutTest (0.89s) ActionView::Template::Error: ActionVie

我是编程新手,在尝试阅读Rails教程的第9章时遇到以下错误。我检查了几次代码,但仍然不明白为什么没有定义局部变量或方法。每次重写代码时,我都会遇到类似的错误:未定义的局部变量或方法“current_user”

错误:

ERROR["test_layout_links", SiteLayoutTest, 0.888518]
test_layout_links#SiteLayoutTest (0.89s)
ActionView::Template::Error:         ActionView::Template::Error: undefined local variable or method `current_user' for #<#<Class:0x007fcd97c44cf0>:0x007fcd97c4c4a0>
        app/helpers/sessions_helper.rb:22:in `logged_in?'
        app/views/layouts/_header.html.erb:8:in `_app_views_layouts__header_html_erb__1982327839123609485_70260496954760'
        app/views/layouts/application.html.erb:12:in `_app_views_layouts_application_html_erb___2753884707929057206_70260450931560'
        test/integration/site_layout_test.rb:6:in `block in <class:SiteLayoutTest>'
    app/helpers/sessions_helper.rb:22:in `logged_in?'
    app/views/layouts/_header.html.erb:8:in `_app_views_layouts__header_html_erb__1982327839123609485_70260496954760'
    app/views/layouts/application.html.erb:12:in `_app_views_layouts_application_html_erb___2753884707929057206_70260450931560'
    test/integration/site_layout_test.rb:6:in `block in <class:SiteLayoutTest>'
会话\u助手\u测试

require 'test_helper'

class SessionsHelperTest < ActionView::TestCase

  def setup
    @user = users(:michael)
    remember(@user)
  end

  test "current_user returns right user when session is nil" do
    assert_equal @user, current_user
    assert is_logged_in?
  end

  test "current_user returns nil when remember digest is wrong" do
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_nil current_user
  end
end
需要“测试助手”
类SessionHelperTest
我认为您可能缺少当前用户的
方法


虽然名称相似,
current\u user
current\u user?
是完全不同的方法。问号是一种惯例,通常意味着该方法将返回true或false。

您的
会话\u helper.rb中缺少一个
当前用户
方法。回头看看

你的问题是什么?它就像一个符咒!!两种方法使用相同的注释,因此我认为它们实际上是相同的。谢谢你,德文!!
class UsersController < ApplicationController

  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
  end

  def update
    if @user.update_attributes(user_params)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                               :password_confirmation)
    end

    # Before filters

    # Confirms a logged-in user.
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end

    # Confirms the correct user.
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless current_user?(@user)
    end
end
module SessionsHelper

    #logs in the given user.
        def log_in(user)
        session[:user_id] = user.id
    end

    #Remembers a user in a persistent session.
    def remember(user)
        user.remember
        cookies.permanent.signed[:user_id] = user.id
        cookies.permanent[:remember_token] = user.remember_token
    end

    #Returns the user corresponding to the remember token cookie.
    def current_user?(user)
    user == current_user
    end

    #returns true if the user is logged in, false otherwise.
    def logged_in?
        !current_user.nil?
    end

    #Forgets a persistent session.
    def forget(user)
        user.forget
        cookies.delete(:user_id)
        cookies.delete(:remember_token)
    end

    #logs out the current user.
    def log_out
        forget(current_user)
        session.delete(:user_id)
        @current_user = nil
    end

    # Redirects to stored location (or to the default).
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

  # Stores the URL trying to be accessed.
  def store_location
    session[:forwarding_url] = request.url if request.get?
  end
end
require 'test_helper'

class SessionsHelperTest < ActionView::TestCase

  def setup
    @user = users(:michael)
    remember(@user)
  end

  test "current_user returns right user when session is nil" do
    assert_equal @user, current_user
    assert is_logged_in?
  end

  test "current_user returns nil when remember digest is wrong" do
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_nil current_user
  end
end