Ruby on rails Rails-未知属性密码
我一直在关注MichaelHartl的RubyonRails教程,尝试将用户添加到我的应用程序中。阅读第6章,我添加了我认为对我的用户来说是必要的字段,特别是密码和通过“has_secure_password”确认密码 我认为在我的用户模型中添加“has_secure_password”将包括属性“password”和“password_confirmation”,只要我在模型中添加“password_digest”。我按照书上的指示做了那件事。但是,当我运行测试时,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会给我以下错误:
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_访问器以进行密码和密码确认?谢谢您的帮助。这是有效的,谢谢你对两个用户定义的建议。我在这方面还是有点新手,所以这可能是一个解决方案。我试图解决另一个问题,但忘记删除它。谢谢你的帮助。这是有效的,谢谢你对两个用户定义的建议。我在这方面还是有点新手,所以这可能是一个解决方案,我试图解决另一个问题,但忘记删除它。