多步ActiveRecord的模型验证

时间:2016-11-13 20:16:11

标签: ruby-on-rails validation activerecord

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

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

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

  • 第一步,包括字段名字,姓氏和电子邮件
  • 第二步,密码,电话和地址。

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

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

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

1 个答案:

答案 0 :(得分:2)

就个人而言,我会让模型管理它自己的验证,并将管理每一步验证的逻辑移到那里。

现在,这可能不是最优雅的方式,但它有效并且不会使代码混乱太多。

向模型添加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

当然不要忘记为模型设置当前步骤,例如通过在表单的隐藏字段中对其进行硬编码(如果为每个步骤呈现单独的表单)并更改params以接收它。 / p>