【问题标题】:undefined method `authenticate' for #<User:0x7b7adf0>#<User:0x7b7adf0> 的未定义方法“身份验证”
【发布时间】:2016-04-12 08:20:10
【问题描述】:

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

这是我的编码 -

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

【问题讨论】:

  • 请发布您的user.rb 模型。
  • @Pavan 我正在更新我的问题。请查看user.rb型号
  • 好吧,你应该在user.rb 模型中拥有authenticate 方法。您是否按照任何教程在您的应用中创建此身份验证逻辑?
  • 看起来你应该包括一些身份验证宝石。
  • 您应该创建您的身份验证方法。 railscasts.com/episodes/250-authentication-from-scratch

标签: ruby-on-rails ruby


【解决方案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

【讨论】:

  • 我将在Gemfile 这个gem "bcrypt-ruby", :require =&gt; "bcrypt"gem 'bcrypt', '~&gt; 3.1.7' 中添加哪一行?
  • gem 'bcrypt', '~&gt; 3.1.7'
  • 使用 gem "bcrypt-ruby", :require =&gt; "bcrypt" 就像 railscast 教程所做的那样。
  • @HashRocket 谢谢。让我在我的项目中这样做。
【解决方案2】:

在您的user 模型中,您需要添加has_secure_password

bcrypt (~&gt; 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:安全密码的完整实现。绿色 app/models/user.rb**

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 2019-07-10
  • 2010-09-13
  • 2018-08-03
  • 2017-01-19
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多