Ruby on rails RailsTutorial SessionHelper是如何被UsersContoller引用的?
我正在跟随Michael Hartl的Rails教程,遇到了一个问题,我正试图解决这个问题。我有几个测试失败,表明“sign_in”不是有效的函数 声明如下: 您可以看到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中的示例
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”。