多步ActiveRecord的模型验证

2024-05-30

考虑具有以下字段的用户模型:

  • 名字(必填)
  • 姓氏(必填)
  • 电子邮件(必填)
  • 要求输入密码)
  • 电话(必填,大小:10 位数字)
  • 地址(必填)

以及包含以下步骤的多步骤注册表单:

  • 第一步,包含“名字”、“姓氏”和“电子邮件”字段
  • 第二步输入密码、电话和地址。

您将如何创建一个解决方案来验证每个步骤中的输入?

标准 ActiveRecord 的方式不起作用,因为它会同时验证所有字段。

我已经为这个问题创建了一个解决方案,但结果是代码很复杂,所以我正在寻找替代方案。


就我个人而言,我会让模型管理它自己的验证,并将管理每个步骤验证的逻辑移至该模型。

现在,这可能不是最优雅的方法,但它很有效,并且不会使代码过于混乱。

Add a step模型的瞬态属性。

attr_accessor :step

将以下方法添加到模型中以检查步骤是否正确:

def on_step(step_number)
  step == step_number or step.nil?
end

的原因step.nil?- 这样做的优点是,如果您想在该模型上使用验证而不使用步骤,只需不要为模型上的步骤分配值,并且该方法将允许返回 true,从而始终执行验证。

将验证更改为仅在正确步骤时进行处理,或者在不使用步骤时绕过

validates :first_name, if: "on_step 1", presence: true
validates :last_name,  if: "on_step 1", presence:true
validates :email,      if: "on_step 1", presence:true

validates :password,   if: "on_step 2", presence:true
validates :phone,      if: "on_step 2", format:{ with: TEL_REGEX  }, allow_blank: false
validates :address,    if: "on_step 2", presence:true

当然,不要忘记设置模型的当前步骤,例如通过将其硬编码在表单的隐藏字段中(如果为每个步骤渲染单独的表单)并更改参数以接收它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多步ActiveRecord的模型验证 的相关文章

随机推荐