Rails проверяется только при создании или обновлении пользователя
У меня есть validates_confirmation_of :password
в моей модели пользователя. Проблема в том, что я тоже бегу @comment.user.save!
когда создается комментарий для обновления некоторых атрибутов в учетной записи пользователя.
Я получаю ошибку при создании комментария Validation failed: Password confirmation can't be blank
, Я не могу добавить :on => "save"
к моей проверке, потому что мой comments
контроллер также вызывает функцию сохранения.
Я читал эту тему Проверка модели Rails только при создании и обновлении, но она не отвечает на мою конкретную проблему.
ОБНОВЛЕНИЕ Фрагмент модели пользователя:
class User < ActiveRecord::Base
attr_accessor :password
# validations
validates_presence_of :username
validates_length_of :username, :within => 6..25
validates_uniqueness_of :username
validates_presence_of :email
validates_length_of :email, :maximum => 100
validates_format_of :email, :with => EMAIL_REGEX
validates_confirmation_of :password, :if => :password_changed?
validates_presence_of :password_confirmation
validates_length_of :password, :within => 4..25, :on => :create
before_save :create_hashed_password
after_save :clear_password
private
def clear_password
self.password = nil
end
end
2 ответа
В соответствии с этим validates_confirmation_of модель должна быть действительной, если поле password_confirmation равно nil. Вы храните это в DDBB? Или, возможно, что-то не так с вашей проверкой, не могли бы вы вставить сюда свою модель пользователя?
В любом случае вы можете попробовать что-то вроде этого:
validates_presence_of :password_confirmation, if: -> { password.present? }
validates_confirmation_of :password, if: -> { password.present? }
Почему именно ты бежишь @comment.user.save!
? Касание (например, обновление временных меток) и увеличение количества комментариев может быть сделано с помощью встроенных механизмов.
Изменить: я бы предложил что-то похожее на:
class Comment < ActiveRecord::Base
after_save :rank_user
def rank_user
# calculate rank
user.update_attribute(:rank, rank)
end
end
Преимущества этого подхода:
- Ваш контроллер и модели будут чистыми и
rank_user
будет вызываться автоматически, без явного вызова@comment.user.save!
, - Согласно
update_attribute
документация, проверки будут пропущены, что не приведет к ошибкам при подтверждении пароля.