2009-06-13 58 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