对于#<user:0x7b7adf0>,未定义的方法`authenticate'

时间:2016-04-12 08:20:11

标签: ruby-on-rails ruby

我是红宝石的新手。我试图创建一个登录页面。但是我收到了这个错误。

enter image description here

这是我的编码 -

users_controller.rb

def login
    @title = 'Login'
    render layout: 'login'
  end
  def create_login
    #user = User.find_by(username: params[:user][:username].downcase).first
    user = User.where("username = ?", params[:user][:username].downcase).first
    if user && user.authenticate(params[:user][:password])
      # Log the user in and redirect to the user's show page.
      log_in @user
      redirect_to @user
    else
      flash[:danger] = 'Invalid email/password combination' # Not quite right!
      render 'new'
    end
  end

router.rb

get    'login'   => 'users#login'
post   'login'   => 'users#create_login'

sessions_helper.rb

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

user.rb

class User < ActiveRecord::Base
  validates :name, presence: true


  validates :name, length: { minumum:2, maximum: 30 }


  #validates :password, presence: true
  #validates :password, length: { in: 6..20 }
  validates :password, :presence =>true,
                    :length => { :minimum => 6, :maximum => 40 },
                    :confirmation =>true
  #validates_presence_of :password_confirmation, if: :password_changed?


  #validates_uniqueness_of :username
  #validates :email, confirmation: true
  validates :username, :presence => true,
           :uniqueness => { :case_sensitive => false }

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, :presence => true,
           :format => { :with => email_regex },
           :uniqueness => { :case_sensitive => false }

  validates :dob, presence: true
  #dob_regex = /\d{2}\-\d{2}\-\d{4}/       
  #validates :dob, :presence => true, :format => { :with => dob_regex }
end

2 个答案:

答案 0 :(得分:1)

您关注的教程使用bcrypt gem。检查它是否在gemfilebundle install上。

对于身份验证方法,请参阅railscasts using bcrypt

中的本教程

railscast身份验证方法的一部分:

def self.authenticate(email, password)
  user = find_by_email(email)
  if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
    user
  else
    nil
  end
end

答案 1 :(得分:0)

user模型中,您需要添加has_secure_password

bcrypt (~> 3.1.7)添加到Gemfile以使用has_secure_password

gem 'bcrypt', '~> 3.1.7'

class User < ActiveRecord::Base
  #your other code
  has_secure_password
end

现在可以访问authenticate方法

More on it

在您提及link of the book时,您可以看到您错过了它。

转到第6章

  
    

代码清单6.39:安全密码的完整实现。绿色     应用程序/模型/ user.rb **