2014-01-14 2 views
2

Я работаю над проектом и нуждаюсь в некоторой помощи, с чего начать. У меня есть три страницыRails Условные проверки

  • Update Пользователь
  • Создать User
  • Администратор Пользователь Password Change (как жесткого сброса пароля, но только администратор может сбросить пароль пользователя)
  • Изменить пароль

On Создать имя пользователя, фамилию, имя пользователя, пароль и подтверждение пароля являются обязательными.

При обновлении пользователя только имя, фамилия и имя пользователя являются обязательными.

Пароль администратора и изменение пароля пользователя, только пароль и подтверждение пароля являются обязательными.

Как бы вы это сделали? Я не думаю, что это возможно с помощью моделей, использующих validates_presence_of с if, потому что слишком много сценариев. Любая помощь или руководство будут оценены. Кроме того, я довольно новичок в Rails, если вы уже не можете сказать.

ответ

4

Вы можете передать условные свои валидации:

validates :password, :confirmation => true, :presence => true 
validates :first_name, :last_name, :username, :presence => true 
validate :admin_user_password_change? 

Конечно вы должны определить, что метод admin_user_password_change? будет определить, является ли пользователь админа изменения пароля.

UPDATE

Метод admin_user_password_change? может быть что-то вроде:

def admin_user_password_change? 
    unless self.admin? && self.password.present? && self.password_confirmation.present? 
    self.errors.add(:admin_password_change, "password and password_confirmation are required.") 
    end 
end 

Что касается Как это будет взаимодействовать с контроллером?, это было бы не напрямую. Но если какое-либо из условий в методе ложно (например, self.admin? && self.password.present? && self.password_confirmation.present?), в экземпляр User будет добавлена ​​ошибка, и экземпляр не будет сохранен в контроллере.

+0

Как бы 'admin_user_password_change' метод в модели взаимодействия с контроллером? В принципе, как я могу определить 'admin_user_password_change'? – evanvee

+0

@CDub это выглядит чем-то подозрительным, первое, что пользовательские настройки shuffs устанавливает 'validates: password, confirm: true, presence: true', а затем' validates: first_name,: last_name,: username' достаточно для создания и обновления. нет необходимости устанавливать его снова для обновления, исключая поле пароля. модель не будет проверять эту проверку, пока пользователь не попытается установить их nil –

+0

@NitinJ - хороший вызов. Я уточню свой ответ. – CDub

0

Установка некоторых полей в новые значения не unset другие поля; просто потому, что вы только обновляете некоторые полей в одном действии не означает, что другие поля будут unset, если они начинаются в согласованном состоянии.

Просто добавьте свои подтверждения. Он будет работать нормально.

0

Вы можете сказать, к вашей работе проверки только на определенном cenarios только с использованием:

создать:

validates :first_name, :last_name, :username, presence: true, on: :create 

Обновления:

validates :password, presence: true, on: :update 

Взгляните на on.

Для проверки на основе контекста взглянуть на Context Validations

Смежные вопросы