У меня есть модель User
, где следующие проверки
validates :username, :presence => true, :uniqueness => true
validates :email, :presence => true, :uniqueness => true
validates :password, :confirmation => true
validates_presence_of :password, :on => :create
validates_presence_of :bnet_username, :on => :update
validates_presence_of :bnet_code, :on => :update
Причина, по которой bnet_username
и bnet_code
только при обновлении, заключается в том, что у меня уже были существующие пользователи, когда я добавил эти поля, а их нет в регистрационной форме, поэтому мне нужно, чтобы пользователи устанавливали их только после того, как они ' перерегистрирован на сайте.
Однако есть одна проблема, когда пользователь, не установив bnet_username
и bnet_code
, пытается сбросить свой пароль. В этом случае PasswordResetController
попытается обновить свои атрибуты, но проверка не удастся.
if @user.update_attributes(params[:user])
redirect_to root_url, :notice => "Password has been reset! You can now log in."
...
Проблема в том, что мне нужно подтвердить пароль, когда пользователь пытается его сбросить, но я не хочу проверять его, когда он просто обновляет свой профиль.
Я также не могу пропустить проверку все вместе при сбросе пароля, потому что мне нужно проверить сам пароль.
Есть ли какое-то простое решение о том, как сказать, какие именно проверки мне нужно выполнить? Или я подхожу к этому совершенно неправильно?
edit : В основном есть один случай, когда это вызывает проблемы. Существующий пользователь, который еще не установил свои bnet_username
и bnet_code
, но хочет изменить свой пароль.
Поскольку смена пароля является действием обновления, оно будет запускать проверки для bnet_username
и bnet_password
. Но мне нужно, чтобы они устанавливались только при обновлении, потому что я хочу, чтобы пользователи устанавливали их при редактировании своего профиля.
Это необязательное поле, когда пользователь регистрируется, но они должны устанавливать его, когда пытаются обновить информацию профиля.