2015-01-10 81 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