2015-01-10 86 views
1

我正在尝试为我的生产数据库播种表用户的记录。这里是模型:在Rails4中神秘的“验证失败:密码太短”

class User < ActiveRecord::Base 
    include Person 
    include Contact 
    has_many :coworkers, :class_name => 'Coworker' 
    has_many :customers, :class_name => 'Customer' 
    has_many :locations, :class_name => 'Location' 
    has_many :appointment_types, :class_name => 'AppointmentType' 
    before_save { self.email = email.downcase } 
    #before_create :create_remember_token 
    # password 
    has_secure_password 
    attr_accessor :remember_token, :activation_token, :reset_token 
    validates :password, length: { minimum: 6 }, on: :create 
    # rem_notice_hrs 
    validates :rem_notice_hrs, presence: true 
    validates :rem_notice_hrs, numericality: true 
    # rem_text 
    validates :rem_text, presence: true 
    # mandatory email: 
    validates :email, presence: true, length: { maximum: 255 }, 
      format: { with: VALID_EMAIL_REGEX } 

    after_initialize :init 

    #def create_remember_token 
    # self.remember_token = Account.digest(Account.new_remember_token) 
    #end 
    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
     BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    # Remembers a user in the database for use in persistent sessions. 
    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 

    # Returns true if the given token matches the digest. 
    def authenticated?(attribute, token) 
    digest = send("#{attribute}_digest") 
    return false if digest.nil? 
    BCrypt::Password.new(digest).is_password?(token) 
    end 

    # Forgets a user. 
    def forget 
    update_attribute(:remember_digest, nil) 
    end 

    # Sets the password reset attributes. 
    def create_reset_digest 
    self.reset_token = User.new_token 
    update_attribute(:reset_digest, User.digest(reset_token)) 
    update_attribute(:reset_sent_at, Time.zone.now) 
    end 

    # Sends password reset email. 
    def send_password_reset_email 
    UserMailer.password_reset(self).deliver_now 
    end 

    # Returns true if a password reset has expired. 
    def password_reset_expired? 
    reset_sent_at < 2.hours.ago 
    end 

    private 

    def init 
    if self.new_record? 
     if self.rem_notice_hrs.nil? 
     self.rem_notice_hrs = 24 
     end 
     if self.rem_text.nil? 
     if self.company.nil? 
      self.rem_text = "Dear [customer title: automatic] [customer family name: automatic], this is a reminder of your appointment with %{title} %{family_name} on [date/time]." 
     else 
      self.rem_text = "Dear [title] [customer family name], this is a reminder of your appointment with %{company} on [date/time]." 
     end 
     end 
     if self.start_day.nil? 
     self.start_day = Time.now 
     end 
    end 
    end 
end 

这里是种子:

User.create!(first_name: "Nick", 
     email: "[email protected]", 
     password:    "user12", 
     password_confirmation: "user12", 
     phone: 7933336337, 
     rem_notice_hrs: 24, 
     rem_text: "This is a reminder", 
     start_day: "2014-11-21 21:50:16", 
) 

我正在通过Capistrano的种子任务,我得到:

ActiveRecord::RecordInvalid: Validation failed: Password is too short (minimum is 6 characters) 
/home/deploy/appmate/shared/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/validations.rb:79:in `raise_record_invalid' 
/home/deploy/appmate/shared/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/validations.rb:43:in `save!' 
/home/deploy/appmate/shared/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/attribute_methods/dirty.rb:29:in `save!' 
/home/deploy/appmate/shared/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/transactions.rb:291:in `block in save!' 

这是怎么回事错在这里?密码恰好有6个字符。验证错误不应该出现?!

+1

您可以创建用户与长度为6的在轨控制台的密码? – JTG

+0

@JTG:是的 - 在笔记本电脑上的开发环境中。我现在正在尝试生成生产数据库。生产中的代码已经部署完毕,因此与笔记本电脑上的代码完全相同。 – Nick

+0

@JTS:我只是通过在生产服务器上打开rails控制台来手动播种数据库。所以我解决了我的问题。但我仍然不知道为什么运行capistrano任务会导致验证错误。 – Nick

回答

0

我刚刚在开发中遇到同样的问题,而且我还没找到解决方法。现在我要离开密码验证。

validates_confirmation_of :password 
    validates_length_of :password, :within => 4..20 
    validates_presence_of :password, :if => :password_required? 

从本地主机:3000 /用户/新我输入[email protected] /密码,我收到的错误:

2 errors prohibited this user from being saved:

Password is too short (minimum is 4 characters) Password can't be blank