2015-10-19 47 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

相關問題