簡體   English   中英

Rails教程Ch8。 邁克爾·哈特爾(Michael Hartl)-未定義的方法Remember_token

[英]Rails Tutorial Ch8. Michael Hartl - Undefined method remember_token

我正在關注Michael Hartl撰寫的railstutorial.org,並在嘗試登錄后記住用戶時在第8章遇到了麻煩。 問題是我得到了一個未定義的方法Remember_token。 我經歷並重新完成了所有步驟,多次重置/回滾了數據庫並進行了遷移,經歷了我能找到的所有堆棧溢出問題,但沒有任何反應。

另外,我對語法進行了三重檢查,並列出了教程中顯示的語法。 該程序能夠創建用戶,在注冊和注銷后顯示用戶個人資料。 當我注銷並嘗試為該用戶重新登錄時,未知方法會標記出來。 關於stackoverflow的很多答案都說數據庫中沒有匹配的架構,但是我已經遷移並檢查了它,一切都匹配了。 包括幾個DB:drop命令,然后是DB:migrate。

本教程給我帶來麻煩的部分始於8.4.1記住令牌和摘要,第8章鏈接: https : //www.railstutorial.org/book/log_in_log_out

我很感謝您的幫助,似乎無法與您分享一下! 完整的錯誤消息:錯誤消息的圖片

**Error message received through the test:**
ERROR["test_login_with_valid_inforamtion_followed_by_logout", UsersLoginTest, 2016-01-20 10:04:41 +0000]
 test_login_with_valid_inforamtion_followed_by_logout#UsersLoginTest (1453284281.57s)
NoMethodError:         NoMethodError: undefined method `remember_token=' for #<User:0x00000009688838>
            app/models/user.rb:28:in `remember'
            app/helpers/sessions_helper.rb:10:in `remember'
            app/controllers/sessions_controller.rb:10:in `create'
            test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>'
        app/models/user.rb:28:in `remember'
        app/helpers/sessions_helper.rb:10:in `remember'
        app/controllers/sessions_controller.rb:10:in `create'
        test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>'

user.rb文件

 class User < ActiveRecord::Base

  attr_accessor :remeber_token

 #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 persisten sessions
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end

  def authenticated?(remember_token)
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
  end

end 

users_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])

  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      log_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  private 


    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end
end

sessions_controller

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
    redirect_to root_url
  end
end

sessions_helper.rb

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Remembers a user in a persistent session.
  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  # Returns the user corresponding to the remember token cookie.
  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

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

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

_add_remember_digest_to_users.rb

class AddRememberDigestToUsers < ActiveRecord::Migration
  def change
    add_column :users, :remember_digest, :string
  end
end

attr_accessor:記住密碼

你有錯字

上面的代碼必須是:

attr_accessor :remember_token

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM