Ruby on rails Rails-未知属性密码

Ruby on rails Rails-未知属性密码,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,我一直在关注MichaelHartl的RubyonRails教程,尝试将用户添加到我的应用程序中。阅读第6章,我添加了我认为对我的用户来说是必要的字段,特别是密码和通过“has_secure_password”确认密码 我认为在我的用户模型中添加“has_secure_password”将包括属性“password”和“password_confirmation”,只要我在模型中添加“password_digest”。我按照书上的指示做了那件事。但是,当我运行测试时,Rails会给我以下错误:

我一直在关注MichaelHartl的RubyonRails教程,尝试将用户添加到我的应用程序中。阅读第6章,我添加了我认为对我的用户来说是必要的字段,特别是密码和通过“has_secure_password”确认密码

我认为在我的用户模型中添加“has_secure_password”将包括属性“password”和“password_confirmation”,只要我在模型中添加“password_digest”。我按照书上的指示做了那件事。但是,当我运行测试时,Rails会给我以下错误:

Error:
UserTest#test_should_be_valid:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:8:in `setup'
我尝试了解决方案,但它仍然给了我相同的错误,无法识别属性“password”或“password\u confirmation”。我使用“gem install bcrypt”安装了bcrypt,并在我的gem文件中包含以下内容:

gem'bcrypt ruby',:require=>bcrypt'

我使用的是Rails 5,似乎“has_secure_password”没有提供我需要的密码属性。有人能看到我遗漏了什么或做错了什么导致“has_secure_password”无法正常工作吗?谢谢

用户模型:

class User < ApplicationRecord

  has_many :activities

  class User < ActiveRecord::Base

    attr_accessor :name, :email, :password, :password_confirmation
    has_secure_password

    validates :first_name, presence: true, length: {minimum: 1}
    validates :last_name, presence: true, length: {minimum: 1}
    validates :email, presence: true, uniqueness: true, length: {minimum: 5}
    validates :username, presence: true, uniqueness: true, length: {minimum: 1}
    validates :password_digest, length: {minimum: 6}
    validates :password, :confirmation => true, length: {minimum: 4}
    validates :password_confirmation, presence: true

    #-----------------------New Stuff ---------------------------------------
    acts_as_authentic do |c|
      c.crypto_provider = Authlogic::CryptoProviders::Sha512
    end
    #------------------------------------------------------------------------

    #---------------Unsure if working--------------
    #validates_presence_of :password, :on => :create
    #validates_presence_of :email
    #validates_uniqueness_of :email
    #----------------------------------------------

    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

    def encrypt_password
      if password.present?
        self.password_salt = BCrypt::Engine.generate_salt
        self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
      end
    end
  end
end
用户测试:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
  def setup
    @user = User.new(first_name: 'test', last_name: 'tester', password: '1234',email: 'test1@mail.com',
                     password: 'foobar', password_confirmation: 'foobar')
  end
  test 'should be valid' do
    assert @user.valid?
  end
end
require 'bcrypt'

  def setup
    @user = User.new(first_name: 'test', last_name: 'tester', password: BCrypt::Password.create("my password") ,email: 'test1@mail.com', password_confirmation: 'my password')
  end
  test 'should be valid' do
    assert @user.valid?
  end
需要“测试助手”
类UserTest
更新:

我已经测试过了,它是有效的。所以“希望”也适用于您:)看起来MiniTest在BCrypt中不起作用。我收到了相同的错误-未定义的密码,但后来实现了我的更改,并且做得更好


原始答复:

截至您创建时,我认为这没有意义-为
:password
:password\u confirmation
添加getter方法,尤其是setter方法。因为
有\u secure\u密码
实际上创建了通过BCrypt运行的密码。那么,它不是围绕着加密/加密吗?如果是这样,那就不安全了。因此,我看到的唯一测试选项是将byscript放入测试套件中。我认为这样的事情可能会影响trck:

在用户测试中:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
  def setup
    @user = User.new(first_name: 'test', last_name: 'tester', password: '1234',email: 'test1@mail.com',
                     password: 'foobar', password_confirmation: 'foobar')
  end
  test 'should be valid' do
    assert @user.valid?
  end
end
require 'bcrypt'

  def setup
    @user = User.new(first_name: 'test', last_name: 'tester', password: BCrypt::Password.create("my password") ,email: 'test1@mail.com', password_confirmation: 'my password')
  end
  test 'should be valid' do
    assert @user.valid?
  end
注意,我删除了重复的
密码:“foobar
。由于使用该特定测试,您正在测试是否可以创建用户,因此不应传递不同的密码,甚至不应传递重复的属性。。。为此再做一次测试(也检查夹具,它们对于创建测试对象非常有用,对于更复杂的情况也非常有用)

当然,从您的用户模型中删除
atr\u访问器:password、:password\u confirmation

p、 请修复用户类的代码段。还是真的像这样定义了两次

class User < ApplicationRecord

  has_many :activities

  class User < ActiveRecord::Base
class用户
更新:

我已经测试过了,它是有效的。所以“希望”也适用于您:)看起来MiniTest在BCrypt中不起作用。我收到了相同的错误-未定义的密码,但后来实现了我的更改,并且做得更好


原始答复:

截至您创建时,我认为这没有意义-为
:password
:password\u confirmation
添加getter方法,尤其是setter方法。因为
有\u secure\u密码
实际上创建了通过BCrypt运行的密码。那么,它不是围绕着加密/加密吗?如果是这样,那就不安全了。因此,我看到的唯一测试选项是将byscript放入测试套件中。我认为这样的事情可能会影响trck:

在用户测试中:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
  def setup
    @user = User.new(first_name: 'test', last_name: 'tester', password: '1234',email: 'test1@mail.com',
                     password: 'foobar', password_confirmation: 'foobar')
  end
  test 'should be valid' do
    assert @user.valid?
  end
end
require 'bcrypt'

  def setup
    @user = User.new(first_name: 'test', last_name: 'tester', password: BCrypt::Password.create("my password") ,email: 'test1@mail.com', password_confirmation: 'my password')
  end
  test 'should be valid' do
    assert @user.valid?
  end
注意,我删除了重复的
密码:“foobar
。由于使用该特定测试,您正在测试是否可以创建用户,因此不应传递不同的密码,甚至不应传递重复的属性。。。为此再做一次测试(也检查夹具,它们对于创建测试对象非常有用,对于更复杂的情况也非常有用)

当然,从您的用户模型中删除
atr\u访问器:password、:password\u confirmation

p、 请修复用户类的代码段。还是真的像这样定义了两次

class User < ApplicationRecord

  has_many :activities

  class User < ActiveRecord::Base
class用户
为什么在用户类中有用户类?为什么要声明一个attr\u访问器以进行密码和密码确认?为什么在用户类中有一个用户类?为什么要声明一个attr_访问器以进行密码和密码确认?谢谢您的帮助。这是有效的,谢谢你对两个用户定义的建议。我在这方面还是有点新手,所以这可能是一个解决方案。我试图解决另一个问题,但忘记删除它。谢谢你的帮助。这是有效的,谢谢你对两个用户定义的建议。我在这方面还是有点新手,所以这可能是一个解决方案,我试图解决另一个问题,但忘记删除它。