Как я могу проверить только определенные поля при выполнении update_attributes в Rails? - PullRequest
0 голосов
/ 29 ноября 2011

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

Это необязательное поле, когда пользователь регистрируется, но они должны устанавливать его, когда пытаются обновить информацию профиля.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Вы пробовали что-то подобное?

validates_presence_of :bnet_username, :on => :update, 
  :if => Proc.new { |user| !user.bnet_username.blank? }
validates_presence_of :bnet_code, :on => :update,
  :if => Proc.new { |user| !user.bnet_code.blank? }  
0 голосов
/ 29 ноября 2011

Вы можете передать параметры :if и :unless в проверки, с помощью которых вы можете определить, когда вы хотите проверить это конкретное поле.

Пример:

:validate_presence_of :email, :unless => Proc.new { |user| user.signup_step <= 2 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...