Rails проверяется только при создании или обновлении пользователя - PullRequest
4 голосов
/ 29 августа 2011

У меня есть validates_confirmation_of :password в моей модели пользователя. Проблема в том, что я также запускаю @comment.user.save! при создании комментария для обновления некоторых атрибутов учетной записи пользователя.

Я получаю ошибку при создании комментария Validation failed: Password confirmation can't be blank. Я не могу добавить :on => "save" к моей проверке, потому что мой comments контроллер также вызывает функцию сохранения.

Я читал эту ветку Проверка модели Rails только при создании и обновлении , но она не отвечает на мою конкретную проблему.

UPDATE Фрагмент модели пользователя:

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 ]

6 голосов
/ 29 августа 2011

Согласно этому validates_confirmation_of модель должна быть действительной, если поле password_confirmation равно nil. Вы храните это в DDBB? Или, возможно, что-то не так с вашей проверкой, не могли бы вы вставить сюда свою модель пользователя?

В любом случае вы можете попробовать что-то вроде этого:

validates_presence_of :password_confirmation, if: -> { password.present? }
validates_confirmation_of :password, if: -> { password.present? }
6 голосов
/ 29 августа 2011

Почему именно вы запускаете @comment.user.save!? Касание (например, обновление временных меток) и увеличение количества комментариев может быть выполнено с помощью встроенных механизмов.


Edit: Я бы предложил что-то похожее на:

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 проверки будут пропущены, что не приведет к ошибкам при подтверждении пароля.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...