2009-06-13 28 views
3

所有Rails专家网站都表示不要在会话中存储ActiveRecords。但是,我有一个跨页面的多字段ActiveRecord对象。我试图清理的代码使用隐藏字段来传递数据,这似乎是一个坏主意(用户可以篡改一件事)。什么是将模型填充页面分成几页的典型或好方法?基础导轨问题:通过多个页面构建数据

注意:我可以将ActiveRecord保存到数据库,然后使用存储在会话中的ID获取它。问题是ActiveRecord有多个验证,如果没有所有数据,ActiveRecord将不会保存。我可以将参数存储在会话中,或者其他东西....必须有一个标准的方法来做到这一点...

回答

5

我们使用以下模式,看起来很好。

  1. 添加一个名为wizard_stage属性访问器型号:

    attr_accessor:wizard_stage

  2. 添加一个隐藏字段:wizard_stage的形式在每个页面的记录。设置字段的东西反映页面做什么价值,因此,例如:

    f.hidden_​​field:wizard_stage,:值=>“contact_details”

  3. 在模型验证,加入像条件如下:

    验证...:if => lambda {| m | m.wizard_stage ==“contact_details”}

现在的记录可以保存所有提交项目,更多的属性逐渐灌浆的影响。

请注意,这允许攻击者绕过验证,如果他们想要的话,但在我们的情况下(大多数情况下?),这并不重要。

2

使用obj.to_yaml将对象转换为yaml并将yaml保存为db中的文本(甚至是一个平面文件)。将该ID存储在会话中。在需要时重新加载它。 obj.to_yaml序列化对象而不需要保存,跳过rails activerecord验证。

+0

自己序列化它?我希望我们不会这么做......但是它能与ActiveRecords一起工作吗?如果是这样,您可以将Yaml存储在会话本身中... – 2009-06-13 20:54:45

+0

是的,to_yaml适用于所有对象。你可以将它存储在任何你想要的地方我将从我的解决方案中删除保存到文件代码,因为它类似于下面的消息: obj.to_yaml允许您保存对象的部分状态。 – 2009-06-13 21:42:48