考虑具有以下字段的用户模型:
以及包含以下步骤的多步注册表单:
您如何创建解决方案以验证每个步骤中的输入?
标准的ActiveRecord方式不起作用,因为它可以同时验证所有字段。
我已经为这个问题创建了一个解决方案,但结果很复杂,所以我正在寻找替代方案。
答案 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>