如何通过UsersContoller引用RailsTutorial SessionsHelper?

时间:2014-05-09 01:53:05

标签: ruby-on-rails railstutorial.org

我正在关注迈克尔·哈特尔的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

1 个答案:

答案 0 :(得分:2)

您需要包含会话帮助程序才能在控制器/视图层中使用它。您链接到的应用程序代码确实包含会话帮助程序,它只是在application_controller.rb文件中执行此操作,您可以看到here

默认情况下,辅助方法仅适用于其对应的控制器/视图。这意味着,如果users_helper.rb文件夹中有app/helpers文件,则默认情况下,用户控制器和用户视图可以使用其中定义的方法。

如果要在其命名空间之外的助手中使用方法,则必须将其包含在要访问它的范围内。因此,在您的解决方案中包含用户控制器中的SessionsHelper将使其仅供用户控制器和视图使用。如示例应用程序代码中所示,在应用程序控制器中包含帮助程序使得帮助程序方法可用于应用程序中的所有控制器/视图。