基本导轨问题:在多个页面上构建数据

时间:2009-06-13 19:33:59

标签: ruby-on-rails ruby session

所有Rails专家网站都说不会在会话中存储ActiveRecords。但是,我有一个跨多个页面的多字段ActiveRecord对象。我正在尝试清理使用隐藏字段向前传递数据的代码,这似乎是一个坏主意(用户可以篡改一件事)。将模型填充页面分成几个页面的典型或好的方法是什么?

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

2 个答案:

答案 0 :(得分:5)

我们使用以下似乎运作良好的模式。

  1. 将名为wizard_stage的属性访问器添加到模型中:

    attr_accessor:wizard_stage

  2. 将隐藏字段:wizard_stage添加到每个页面中记录的表单中。将字段的值设置为反映页面内容的内容,例如:

    f.hidden_​​field:wizard_stage,:value => 'contact_details'

  3. 在模型验证中,添加如下条件:

    验证......:if =>拉姆达{| M | m.wizard_stage =='contact_details'}

  4. 现在可以为每次提交保存记录,逐渐填写更多属性。

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

答案 1 :(得分:2)

使用obj.to_yaml将object / s转换为yaml,并将yaml作为文本保存在db(甚至是平面文件)中。将id存储在会话中。需要时重新加载。 obj.to_yaml序列化对象而无需保存,跳过rails activerecord验证。