我有一个非常复杂的模型,包含许多字段, has_many 关联, image_column 等添加的图像......

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

我认为 validation_group 可用于定义每个步骤的验证,整体设计如何?

有帮助吗?

解决方案

对于整体设计,您可能需要研究Presenter层的概念(Jay Fields在他的博客条目中定义它 Rails:Presenter Pattern )作为一种在处理复杂/多个模型时保持控制器精简并查看愚蠢的方法。

其他提示

您可以使用一系列方法,例如 step_1 step_2 ,每个人都会检查是否已提交上一步所需的数据。您可以在会话中存储数据,以便例如步骤3仍然可以访问在步骤1中收集和解析的所有数据。在最后一步中,将您存储在会话中的所有数据加上数据从倒数第二步开始使用,并在数据库中创建一个新行或者为您收集数据的任何内容。如果用户搞砸了一个步骤,将它们重定向到上一步,并用他们填写的数据填写表格;例如如果用户搞砸了第2步并提交了导致步骤3的表单,请在 step_3 方法中捕获问题,将用户重定向到 step_2 方法,并确保第2步中的表单元素已预先填充。

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

您还可以允许用户转到上一步(例如,让用户在步骤5时返回步骤3)。

假设您的第一步有一个包含字段'name'和'email'的表单。在 step_2 方法中,您应该验证 params [:name] params [:email] 是否已通过且有效。无论您选择了哪些,都存储在会话或数据库行中。然后在第2步中,您有一个包含字段'age'和'gender'的表单。在 step_3 方法中,您应该验证 params [:age] params [:gender] 是否已通过且有效,并且您还需要确保用户已完成步骤1,以防止用户输入URL直接访问步骤3。等等。

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 状态来确定要运行的验证。我仍然没有弄清楚路线应该如何工作,因为我的案例中的模型是一种资源。例如,哪一组字段应该是编辑操作?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top