代码之家  ›  专栏  ›  技术社区  ›  Tomasz Tybulewicz

Rails中的多页表单

  •  5
  • Tomasz Tybulewicz  · 技术社区  · 16 年前

    我有一个非常复杂的模型,有很多领域, has_many 关联,由添加的图像 image_column 等。。。

    新对象将通过多页表单(8个步骤)添加-我应该如何完成这些步骤之间的验证和传播?

    我想 validation_group 对于定义每个步骤的验证可能很有用,总体设计如何?

    3 回复  |  直到 9 年前
        1
  •  6
  •   Michael Sepcot    16 年前

    对于总体设计,您可能希望了解演示者层的概念(jay fields在他的博客条目中定义了它)。 Rails: Presenter Pattern )作为一种在处理复杂/多个模型时保持控制器精简和视图愚蠢的方法。

        2
  •  4
  •   Sarah Vessels    15 年前

    你可以有一系列的方法,例如 step_1 , step_2 ,并且每一个都检查是否提交了上一步骤中的必要数据。您可以在会话中存储数据,例如,步骤3仍然可以访问步骤1中收集和分析的所有数据。在最后一步中,将存储在会话中的所有数据加上要使用的倒数第二步中的数据,然后在数据库中或为其收集数据的任何对象创建新行。如果用户弄乱了一个步骤,请将其重定向到上一个步骤,并用他们填写的数据填写表单;例如,如果用户弄乱了步骤2并提交了导致步骤3的表单,请在 step_3 方法,将用户重定向到 第二步 方法,并确保已预先填充步骤2中的表单元素。

    如果您不想在会话中存储数据,可以在用户提交步骤1之后创建一个新的数据库行,并在每个后续步骤中收集新数据时更新该行中的字段。您可以在行上设置一些“完成”标志,最初将其设置为0,然后在用户成功完成所有步骤后将其设置为1。

    您还可以允许用户执行前面的步骤(例如,让用户在执行步骤5时返回到步骤3)。

    假设您的第一步有一个带有字段“name”和“email”的表单。在你 第二步 方法,您应该验证 params[:name] params[:email] 已通过并且有效。存储在会话或数据库行中,无论您选择什么。然后在步骤2中,您有一个带有字段“年龄”和“性别”的表单。在你 步骤3 方法,您应该验证 params[:age] params[:gender] 已通过并且有效,您还需要确保用户已完成步骤1,以防止用户输入URL直接访问步骤3。等等。

        3
  •  0
  •       15 年前
    class Campaign < ActiveRecord::Base
        with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can|
          spam_can.validates_associated  :spam_can
          spam_can.validates_presence_of :spam_can
        end
      def on_or_past_step
       :
       :
      end
    end
    

    这是一项正在进行中的工作,但我觉得我走对了。我在用 AASM 状态以确定要运行的验证。我仍然没有弄清楚路线应该如何工作,因为在我的例子中,所讨论的模型是一种资源。例如,哪个字段组应该是编辑操作?