Ruby on rails 多步骤ActiveRecord';s模型验证

Ruby on rails 多步骤ActiveRecord';s模型验证,ruby-on-rails,validation,activerecord,Ruby On Rails,Validation,Activerecord,考虑具有以下字段的用户模型: 姓名(必填) 姓氏(必填) 电子邮件(必需) 密码(必需) 电话(必填,尺寸:10位) 地址(必填) 以及包含以下步骤的多步骤注册表单: 第一步,包括名字、姓氏和电子邮件字段 第二步是密码、电话和地址 您将如何创建解决方案来验证每个步骤中的输入? 标准ActiveRecord的方法不起作用,因为它一次验证所有字段 我已经为这个问题创建了一个解决方案,但结果是在一个复杂的代码中,所以我正在寻找替代方案。我个人会让模型管理自己的验证,并将管理每个步骤的验证的逻辑

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

  • 姓名(必填)
  • 姓氏(必填)
  • 电子邮件(必需)
  • 密码(必需)
  • 电话(必填,尺寸:10位)
  • 地址(必填)
以及包含以下步骤的多步骤注册表单:

  • 第一步,包括名字、姓氏和电子邮件字段
  • 第二步是密码、电话和地址
您将如何创建解决方案来验证每个步骤中的输入?

标准ActiveRecord的方法不起作用,因为它一次验证所有字段


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

我个人会让模型管理自己的验证,并将管理每个步骤的验证的逻辑移到这一步

现在,这可能不是最优雅的方法,但它很有效,不会让代码太混乱

步骤
瞬态属性添加到模型中

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

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

Lambda conditional基于
step
属性?当然,您可能有一些复杂的控制器代码<代码>验证:first_name,presence:true,if:lambda{| user | user.step==1}。如果你找到了一个好的答案,Rails社区会很想知道:)你是否需要一个
用户
实例?您可以在此过程中构建一个或两个临时的非
用户
模型,然后在完成后将它们转换为真实的
用户
。总体逻辑相同,但验证的条件性将通过分离模型来处理,而不是在
User
中处理一堆复杂度。