Rails 中的多页表单

Multi page forms in Rails

提问人:Tomasz Tybulewicz 提问时间:10/14/2008 最后编辑:DarkmouseTomasz Tybulewicz 更新时间:12/6/2014 访问量:5557

问:

我有一个非常复杂的模型,其中包含许多字段、关联、图像等......has_manyimage_column

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

我认为对于定义每个步骤的验证可能很有用,那么整体设计呢?validation_group

Ruby-on-Rails 模型-视图-控制器 验证 表单

评论


答:

6赞 Michael Sepcot 10/14/2008 #1

对于整体设计,您可能希望研究 Presenter 层的概念(Jay Fields 在他的博客文章 Rails: Presenter Pattern 中定义了它),作为一种在处理复杂/多个模型时保持控制器纤薄和愚蠢的方法。

4赞 Sarah Vessels 12/12/2008 #2

您可以有一系列方法,例如 、 ,每个方法都会检查是否提交了上一步的必要数据。您可以将数据存储在会话中,以便步骤 3 仍可以访问步骤 1 中收集和分析的所有数据。在最后一步中,将存储在会话中的所有数据以及倒数第二步的数据放入要使用,然后在数据库中创建一个新行或您要收集数据的任何内容。如果用户搞砸了某个步骤,请将他们重定向到上一步,并使用他们填写的数据为他们填写表单;例如,如果用户搞砸了第 2 步并提交了导致第 3 步的表单,请在您的方法中发现问题,将用户重定向到该方法,并确保步骤 2 中的表单元素已预先填写。step_1step_2step_3step_2

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

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

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

评论

0赞 Jeremy White 5/5/2011
我之所以使用此方法,是因为我的表单包含文件上传字段。就我而言,走这条路比处理会话要容易得多。
0赞 2/2/2009 #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 状态来确定要运行哪些验证。我仍然没有弄清楚路线应该如何工作,因为在我的情况下,所讨论的模型是一种资源。例如,哪一组字段应该是编辑操作?