我正在关注迈克尔·哈特尔的Rails教程,并且遇到了一个我正试图解决的问题。我有几个测试失败,表明“sign_in”不是一个有效的函数。
这里宣布:
Rails Tutorial SessionsHelper.rb
您可以在UsersController
函数中看到sign_in
利用create
方法:
Rails Tutorial UsersController.rb
我有相同的设置,但我的单元测试表明UsersController无法找到sign_in函数。如果我声明include SessionsHelper
UsersController.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
答案 0 :(得分:2)
您需要包含会话帮助程序才能在控制器/视图层中使用它。您链接到的应用程序代码确实包含会话帮助程序,它只是在application_controller.rb
文件中执行此操作,您可以看到here。
默认情况下,辅助方法仅适用于其对应的控制器/视图。这意味着,如果users_helper.rb
文件夹中有app/helpers
文件,则默认情况下,用户控制器和用户视图可以使用其中定义的方法。
如果要在其命名空间之外的助手中使用方法,则必须将其包含在要访问它的范围内。因此,在您的解决方案中包含用户控制器中的SessionsHelper
将使其仅供用户控制器和视图使用。如示例应用程序代码中所示,在应用程序控制器中包含帮助程序使得帮助程序方法可用于应用程序中的所有控制器/视图。