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

Преимущества этого подхода:

  1. Ваш контроллер и модели будут чистыми и rank_user будет вызываться автоматически, без явного вызова @comment.user.save!,
  2. Согласно update_attribute документация, проверки будут пропущены, что не приведет к ошибкам при подтверждении пароля.
Другие вопросы по тегам