【问题标题】:Rails - how to validate 2-steps form?Rails - 如何验证两步表单?
【发布时间】:2026-02-10 09:30:01
【问题描述】:

我的注册包含两个步骤。在第一个中,新用户将设置他的姓名、电子邮件和密码。然后他点击“注册”按钮并被重定向到注册表格第二部分的页面(大约 5-7 个字段)。

我已经为所有输入(7-10 个字段)设置了验证规则。问题是,当我填写表单的第一部分然后单击“注册”按钮时,我看到验证错误,因为表单第二部分的字段无效。

如何避免这种行为?

谢谢

【问题讨论】:

  • 查看this 回答也许您不必手动操作。

标签: ruby-on-rails ruby validation registration wizard


【解决方案1】:

您可以定义一个虚拟属性,用于确定在哪个步骤验证哪些属性,然后在with_options 上使用该属性的值来验证每个步骤的必填字段。

类似以下内容:

在你的模型中:

class MyModal < ActiveRecord::Base
  attr_accessor :validate_step

  with_options if: :validate_step_one? do |o|
    o.validates :name, presence: true 
    o.validates :email, presence: true 
    o.validates :password, presence: true 
  end

  with_options if: :validate_step_two? do |o|
    ...
  end

  private:

  def validate_step_one?
    self.validate_step == 'validate_first_step'
  end

  def validate_step_two?
    self.validate_step == 'validate_second_step'
  end
end

然后在你的控制器中:

class MyRegistrationController < ApplicationController
  def show
    case step
      when :first_step
        user.validate_step = 'validate_first_step'
      when :second_step
        user.validate_step = 'validate_second_step'
    end
  end
end

在您的控制器中,在您构建对象的操作中,您需要根据向导中的当前步骤分配validate_first_stepvalidate_second_step

请注意,我使用的值和名称不是很具有描述性/意义,您会更好地知道如何命名它们:)

【讨论】: