我测试用户模型:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :password, :presence => true
has_many :ads, dependent: :destroy
has_many :docs, through: :ads, source: :content, source_type: "Doc"
has_many :pets, through: :ads, source: :content, source_type: "Pet"
has_many :license_plates, through: :ads, source: :content, source_type: "LicensePlate"
end
用户架构如下:
create_table "users", force: true do |t|
t.string "first_name"
t.string "last_name"
t.string "phone"
t.datetime "created_at"
t.datetime "updated_at"
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
end
工厂是:
FactoryGirl.define do
factory :user do
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
phone { Faker::PhoneNumber.phone_number }
email { Faker::Internet.email }
encrypted_password { Faker::Internet.password }
#reset_password_token
end
end
RSpec代码是:
require 'rails_helper'
require 'spec_helper'
describe User do
it "has a valid factory" do
expect(FactoryGirl.build(:user)).to be_valid
end
it { is_expected.to have_many(:ads).dependent(:destroy) }
it { is_expected.to have_many(:docs).through(:ads) }
it { is_expected.to have_many(:pets).through(:ads) }
it { is_expected.to have_many(:license_plates).through(:ads) }
end
运行rspec我有&#34;密码不能为空?&#34;错误
什么可能导致&#34;密码不能为空?&#34;错误?
提前致谢。
答案 0 :(得分:0)
@jvnil的建议是对的。正如您在设计代码https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb
中看到的那样 # Verifies whether an password (ie from sign in) is the user password.
def valid_password?(password)
return false if encrypted_password.blank?
bcrypt = ::BCrypt::Password.new(encrypted_password)
password = ::BCrypt::Engine.hash_secret("#{password}#{self.class.pepper}", bcrypt.salt)
Devise.secure_compare(password, encrypted_password)
end
#
# Generates password encryption based on the given value.
def password=(new_password)
@password = new_password
self.encrypted_password = password_digest(@password) if @password.present?
end
验证
resource = valid_password? && mapping.to.find_for_database_authentication(authentication_hash)