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