Rails中的多页表单
-
03-07-2019 - |
题
我有一个非常复杂的模型,包含许多字段, 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 状态来确定要运行的验证。我仍然没有弄清楚路线应该如何工作,因为我的案例中的模型是一种资源。例如,哪一组字段应该是编辑操作?