2008-10-14 26 views
5

我遇到了许多领域,has_many协会,图像通过image_column等增加了一个相当复杂的模型......多页形式

新对象将多页的形式加入(8级) - 我应该如何完成这些步骤之间的验证和传播?

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

回答

6

对于整体设计,您可能希望查看Presenter图层的概念(Jay Fields在其博客条目Rails: Presenter Pattern中对其进行了定义),以便在处理复杂/多个模型时保持控制器精简和视图愚蠢。

4

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

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

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

假设你的第一步有一个带有'姓名'和'电子邮件'字段的表单。在您的step_2方法中,您应该验证params[:name]和​​已通过并且有效。将它们存储在会话或数据库行中,但是您选择了。然后在步骤2中,您有一个表格,其中包含“年龄”和“性别”字段。在您的step_3方法中,您应验证params[:age]params[:gender]已通过且有效,并且还需要确保用户已完成第1步,以防止用户直接输入URL以访问步骤3。等等。

+0

我使用这种方法,因为我的表单包含文件上传字段。就我而言,走这条路线比处理会话要容易得多。 – 2011-05-04 20:56:41

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