我跟踪railscast https://github.com/railscasts/274-remember-me-reset-password/blob/master/auth-after/app/models/user.rb
当我输入我的电子邮件并按发送时,我得到以下错误:
验证失败:密码太短(最小为6个字符)
指向"save! "
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-zd-]+(.[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
这是因为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'