activerecord recordinvalid error

Я слежу за Railscast https://github.com/railscasts/274-remember-me-reset-password/blob/master/auth-after/app/models/user.rb

Когда я ввожу свою электронную почту и нажимаю отправить, я получаю следующую ошибку:

Ошибка проверки: пароль слишком короткий (минимум 6 символов)

указывая на "сохранить!"

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed
  has_many :reverse_relationships, foreign_key: "followed_id",
                                   class_name:  "Relationship",
                                   dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower
  has_many :messages
  before_save { self.email = email.downcase }
  before_create :create_remember_token
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }


  has_secure_password
  validates :password, length: { minimum: 6 }
  #TEST
  before_create { generate_token(:auth_token) }
  validates_presence_of :password, :on => :create
  #before_create :generate_token

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!

    #kommer att skicka ett mail till användaren
    UserMailer.password_reset(self).deliver
  end

  def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

  def User.new_remember_token
    SecureRandom.urlsafe_base64
  end

  def User.digest(token)
    Digest::SHA1.hexdigest(token.to_s)
  end

  def feed
    Micropost.from_users_followed_by(self)
  end

  def following?(other_user)
    relationships.find_by(followed_id: other_user.id)
  end

  def follow!(other_user)
    relationships.create!(followed_id: other_user.id)
  end

  def unfollow!(other_user)
    relationships.find_by(followed_id: other_user.id).destroy
  end



  private

    def create_remember_token
      self.remember_token = User.digest(User.new_remember_token)
    end
end

2 ответа

Решение

Это потому что save! метод вызывает исключение, когда проверки не пройдены. В вашем случае это следующая проверка:

validates :password, length: { minimum: 6 }

Вы, вероятно, не хотите проверять :password каждый раз, когда вы сохраняете пользователя. Таким образом, вы должны написать эту проверку немного умнее, например:

validates :password, length: { minimum: 6 }, if: :password_required?

def password_required?
  new_record? || password.present?
end

Пароль будет подтвержден только тогда, когда запись новая или пользователь захочет изменить свой пароль.

Это то, что помогло мне добавить эту строку в development.rb

Rails.application.routes.default_url_options [: host] = 'localhost: 3000'

Другие вопросы по тегам