Rails条件验证

时间:2014-01-14 17:30:44

标签: ruby-on-rails

我正在开展一个项目,需要一些帮助才能开始。我有三页

  • 更新用户
  • 创建用户
  • 管理员用户密码更改(如硬重置密码,但只有管理员可以重置用户密码)
  • 更改密码

在创建用户名时,姓氏,用户名,密码和密码确认是强制性的。

在更新用户时,只需要名字,姓氏和用户名。

在管理员用户密码更改和更改密码时,只需输入密码和密码即可。

你会怎么做呢?我不认为通过使用带有if的validates_presence_of的模型可以实现这一点,因为有太多场景。任何帮助或指导将不胜感激。另外,如果你还不知道的话,我对Rails很陌生。

3 个答案:

答案 0 :(得分:4)

您可以将条件传递给您的验证:

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

当然,您必须定义admin_user_password_change?方法,以确定是否是管理员用户更改密码。

<强>更新

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的实例中添加错误,并且实例将不会保存在控制器中。

答案 1 :(得分:0)

将某些字段设置为新值不会取消设置其他字段;只是因为你只在一个动作中更新某些字段并不意味着其他字段将取消设置,只要它们以一致的状态开始。

只需添加验证即可。它会正常工作。

答案 2 :(得分:0)

您只能使用以下内容告知您的验证工作:

创建:

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

更新:

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

看看on

要根据上下文进行验证,请查看Context Validations