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

时间:2011-11-07 15:39:24

标签: ruby-on-rails ruby

我正在研究Hartl书籍的9.3.3并继续陷入

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

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

如果我放入那个我假设我不应该进行的黑客攻击,那么它会以另一个错误登陆我: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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

另外值得补充的是,您需要注意不要被SessionsHelper模块中编写的sign_in帮助程序和spec / support / utilities.rb文件中编写的sign_in弄糊涂。同名,但有两个不同的功能。在测试中,被调用的是在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

答案 3 :(得分:0)

你的ApplicationController不是必须include SessionsHelper吗? (在书中复制9.11),然后在其中定义current_user(列出9.14)?

答案 4 :(得分:0)

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