2015-10-19 46 views
0

一个我我的测试中收到以下错误哈特尔的Rails的教程的第8章。哈特尔Rails的教程章节8.46 NoMethodError

> 1) Error: 
> UsersLoginTest#test_login_with_valid_information_followed_by_logout: 
> NoMethodError: undefined method `forget' for #<Class:0x000000079be3b0> 
>  app/helpers/sessions_helper.rb:30:in `forget' 
>  app/helpers/sessions_helper.rb:37:in `log_out' 
>  app/controllers/sessions_controller.rb:18:in `destroy' 
>  test/integration/users_login_test.rb:40:in `block in <class:UsersLoginTest>' 

我试着完全像在教程中一样拷贝和粘贴代码,但它似乎没有解决问题。

这里是我的会话助手

module SessionsHelper 
    def log_in(user) 
    session[:user_id] = user.id 
    end 

    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    def current_user 
    if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 

     if user && user.authenticated?(cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
    end 


    def logged_in? 
    !current_user.nil? 
    end 

    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

    # Logs out the current user. 
    def log_out 
    forget(current_user) 
    session.delete(:user_id) 
    @current_user = nil 
    end 
end 

我的会话控制器低于

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.find_by(email: params[:session][:email].downcase) 

    if user && user.authenticate(params[:session][:password]) 
     log_in user 
     remember user 
     redirect_to user 
    else 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    log_out if logged_in? 
    redirect_to root_url 
    end 
    end 

任何建议将非常感谢!

+0

看起来你忘了你是从哪里得到这个代码,定义在'User'模型 – illusionist

回答

-1

在这里我们可以看到真正的错误信息密切关注的重要性。它说有一个“没有方法错误”。好。因此,我们正在做与用户的东西,而且也没有方法。用户是一个模拟的事情,所以让我们来看看应用程序/模型/ user.rb:

class User < ActiveRecord::Base 
    attr_accessor :remember_token 
    before_save { self.email = email.downcase } 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    has_secure_password 
    validates :password, presence: true, length: { minimum: 6 } 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    # Remembers a user in the database for use in persistent sessions. 
    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 

    # Returns true if the given token matches the digest. 
    def authenticated?(remember_token) 
    BCrypt::Password.new(remember_digest).is_password?(remember_token) 
    end 

    # Forgets a user. 
    def forget 
    update_attribute(:remember_digest, nil) 
    end 
end 

我们看到,在最后,有一个被称为创建方法“忘记”

def forget 
    #something 
end 

打开了方法来从其他控制器和助手,您已在会话部分已经创建的电话。

+1

的'forget'方法? ,问题中没有这样的事情 – illusionist

相关问题