Ruby on Rails – 坚持Hartl Book第9.3.3章,未定义方法sign_in

我正在研究Hartl书籍的9.3.3并继续坚持使用

SessionsController的未定义方法`sign_in’:0x00000100c0da90

我知道这是因为sign_in方法位于sessions_helper文件中,该文件由模型而不是控制器拾取。 Hartl书不需要“包含SessionsHelper”系列。

如果我把那个hack,我假设我不应该,那么它最终会让我失去另一个错误undefined方法current_user

这是代码

SessionsController.rb

class SessionsController < ApplicationController def new @title = "Sign in" end def create user = User.authenticate( params[:session][:email], params[:session][:password]) if user.nil? flash.now[:error] = "Invalid email/password combo." @title = "Sign in" render 'new' else sign_in user redirect_to user end end def destroy end 

和sessions_helper.rb

  module SessionsHelper def sign_in(user) cookies.permanent.signed[:remember_token] = [user.id, user.salt] self.current_user = user end 

在应用程序控制器中应该有一个“包含SessionsHelper”。 默认情况下,帮助程序包含在视图中,但为了在控制器中使用帮助程序,需要明确包含它。

如果您已经在application_controller中包含了SessionsHelper,并且仍然遇到此失败的测试错误:

如果您在之前的Ch。中的练习中更新了spec / support / utilities.rb文件。 8并且使用了给出的示例,您很有可能创建了“sign_in”方法,但根据第8章练习中的示例将其命名为“valid_signin”,而不是将其命名为“sign_in”。 希望这可以帮助。

这也是基于第二版。 教程但仍应适用于我想象的第一个。

另外值得补充的是,您需要注意不要被SessionsHelper模块中编写的sign_in帮助程序和spec / support / utilities.rb文件中编写的sign_in弄糊涂。 同名,但有两个不同的function。 在测试中,被调用的是在utilities.rb文件中编写的那个(代码清单9.6),如下所示:

 def sign_in(user) visit signin_path fill_in "Email", with: user.email fill_in "Password", with: user.password click_button "Sign in" #sign in when not using capybara as well cookies[:remember_token] = user.remember_token end 

您是否必须在ApplicationController中include SessionsHelper ? (在书中获取9.11),然后在其中定义current_user (列出9.14)?

我犯的错误是我从未将utilities.rb文件放在子文件夹支持中