Ruby on rails 基本Rails问题:在多个页面上构建数据

Ruby on rails 基本Rails问题:在多个页面上构建数据,ruby-on-rails,ruby,session,Ruby On Rails,Ruby,Session,所有Rails专家站点都表示不在会话中存储ActiveRecords。但是,我有一个跨多个页面的多字段ActiveRecord对象。我试图清理的代码使用了隐藏字段来转发数据,这似乎是个坏主意(用户可以篡改一件事)。将模型填充页面划分为多个页面的典型或好方法是什么 注意:我可以将ActiveRecord保存到DB中,然后使用ID获取它,我将ID存储在会话中。。。问题是ActiveRecord有几个验证,如果没有所有数据,它就无法保存。我可以将参数本身存储在会话中,或者其他什么。。。。必须有一种标准

所有Rails专家站点都表示不在会话中存储ActiveRecords。但是,我有一个跨多个页面的多字段ActiveRecord对象。我试图清理的代码使用了隐藏字段来转发数据,这似乎是个坏主意(用户可以篡改一件事)。将模型填充页面划分为多个页面的典型或好方法是什么


注意:我可以将ActiveRecord保存到DB中,然后使用ID获取它,我将ID存储在会话中。。。问题是ActiveRecord有几个验证,如果没有所有数据,它就无法保存。我可以将参数本身存储在会话中,或者其他什么。。。。必须有一种标准的方法来实现这一点…

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

我们使用以下模式,该模式似乎运行良好

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

    属性访问器:向导阶段

  • 在表单中为每个页面中的记录添加一个隐藏字段:向导\u阶段。将字段的值设置为反映页面功能的值,例如:

    f、 隐藏的\u字段:向导\u阶段,:value=>“联系人\u详细信息”

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

    验证…:if=>lambda{m | m.wizard_stage=='contact_details'}

  • 现在可以为每次提交保存记录,逐渐填充更多属性


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

    很好。这是最简单的方法,也可以确保用户在任何给定阶段都不能处理无效数据+第12条评论:应该在服务器端验证正确的阶段。避免篡改。自己序列化?我希望我们不要陷入那个。。。但是它对ActiveRecords有效吗?如果是这样,您可以将Yaml存储在会话本身中……是的,to_Yaml对所有对象都有效。你可以把它存放在任何你想要的地方。我将从我的解决方案中删除“保存到文件”代码,因为它有点模糊了底层消息,即:obj.to_yaml允许您保存对象的部分状态。您通常不希望将部分对象与“完整”对象一起存储在数据库中。创建一个简单的表格来存储YAML文本(id,YAML)并使用它。谢谢你的回答,Ryan。我想知道是否有必要序列化到yaml(或者以任何方式序列化到marshall)以存储在会话中。我认为内置会话存储可以解决这个问题。同时,与使用内置会话存储(例如,部分填充的表单)相比,我一直质疑自主开发的方法……人们认为对象“很大”,但如果愿意,默认会话存储甚至可以使用DB。