Ruby on rails RailsTutorial SessionHelper是如何被UsersContoller引用的?

Ruby on rails RailsTutorial SessionHelper是如何被UsersContoller引用的?,ruby-on-rails,railstutorial.org,Ruby On Rails,Railstutorial.org,我正在跟随Michael Hartl的Rails教程,遇到了一个问题,我正试图解决这个问题。我有几个测试失败,表明“sign_in”不是有效的函数 声明如下: 您可以看到userscoontroller在create函数中利用了sign\u-in方法: 我有相同的设置,但是我的单元测试表明UsersController找不到sign_in函数。如果我声明include sessionHelperuserscoontroller.rb,我的单元测试通过了,但是RailsTutorial中的示例

我正在跟随Michael Hartl的Rails教程,遇到了一个问题,我正试图解决这个问题。我有几个测试失败,表明“sign_in”不是有效的函数

声明如下:

您可以看到
userscoontroller
create
函数中利用了
sign\u-in
方法:

我有相同的设置,但是我的单元测试表明UsersController找不到sign_in函数。如果我声明
include sessionHelper
userscoontroller.rb,我的单元测试通过了,但是RailsTutorial中的示例应用程序显然不需要这样做,所以我想知道我应该寻找什么来帮助调试它

看起来它应该是自动可用的,但我的情况不是这样

为完整起见,以下是我的开发环境中的相关代码:

module SessionsHelper
  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.digest(remember_token))
    self.current_user = user
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token = User.digest(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def signed_in?
    !current_user.nil?
  end
end

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      sign_in @user # unit tests indicate a failure to find sign_in here
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

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

  private

    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end
end
模块会话助手
def登录(用户)
记住\u令牌=User.new\u记住\u令牌
cookies.permanent[:记住\u令牌]=记住\u令牌
user.update_属性(:记住_标记,user.digest(记住_标记))
self.current_user=用户
结束
def当前用户=(用户)
@当前用户=用户
结束
def当前用户
记住\u令牌=User.digest(cookies[:记住\u令牌])
@当前用户| |=用户。查找用户(记住令牌:记住令牌)
结束
def已登录?
!当前_user.nil?
结束
结束
类UsersController
您需要包含会话帮助程序,以便它在控制器/视图层中可用。您链接到的应用程序代码确实包含会话助手,正如您所看到的,它只是在
application\u controller.rb
文件中这样做

默认情况下,助手方法仅对其相应的控制器/视图可用。这意味着,如果您的
app/helpers
文件夹中有一个
users\u helper.rb
文件,则默认情况下,在那里定义的方法将可用于用户控制器和用户视图


如果要使用命名空间之外的帮助器中的方法,则必须将其包含在希望访问该方法的范围内。因此,将
sessionhelper
包含在用户控制器中,就像您在解决方案中所做的那样,将使其仅对用户控制器和视图可用。在应用程序控制器中包含一个助手(如示例应用程序代码中所述),可以使应用程序中的所有控制器/视图都可以使用助手方法。

噢,出于对……的热爱,学习新框架有时会使您在遇到问题时忽略基本内容。谢谢你给我指出显而易见的问题。:)[为清晰起见]在控制器中写入“include SessionHelper”。