2009-06-13 5 views
3

すべてのRailsの専門家のサイトでは、ActiveRecordsをセッションに保存しないと言います。しかし、私はいくつかのページにまたがる複数フィールドのActiveRecordオブジェクトを持っています。私がクリーンアップしようとしているコードは、データを前方に渡すために隠されたフィールドを使用しました。これは悪い考え(ユーザーが1つのことを改ざんする可能性があります)のようです。モデル充填ページをいくつかのページに分割する典型的な、あるいは良い方法は何ですか?基本的なレール質問:数ページにわたるデータの作成

注:ActiveRecordをDBに保存して、セッションで保存したIDで取得できます...問題は、ActiveRecordにいくつかの検証があり、すべてのデータなしで保存できないことです。私はセッションでパラメタ自体を保存することができます....これを行うための標準的な方法が必要です...

答えて

5

次のパターンがうまくいくように見えます。

  1. がモデルにwizard_stageという属性のアクセサを追加します。

    attr_accessor:wizard_stage

  2. 隠しフィールドを追加します。wizard_stageを形成するために、各ページのレコードのために。モデルの検証では値=>「contact_details」

  3. 、のような条件を追加します。

    f.hidden_​​field:wizard_stage、例えばので、ページが何を反映したものにフィールドの値を設定します。次のようになります。

    ... if => lambda {| m | m.wizard_stage == 'contact_details'}

これで、すべての提出物に対してレコードを保存し、徐々に多くの属性を埋め込むことができます。

これにより、攻撃者は妥当性チェックをバイパスできますが、私たちの場合(ほとんどの場合?)はそれほど重要ではありません。

+0

よろしくお願いします。これは最も簡単な方法であり、ユーザーが任意の段階で無効なデータを処理できないようにします。 +1 – fig

+0

2番目のコメント:サーバー側で正しいステージを確認する必要があります。改ざんを避ける。 – fig

+0

+1、Daveのコメントは+1 –

2

obj.to_yamlを使用してオブジェクトをyamlに変換し、yamlをdb (またはフラットファイルでも)。そのIDをセッションに格納します。必要に応じて再ロードしてください。 obj.to_yamlは、saverecordの検証をスキップして、保存せずにオブジェクトを直列化します。

+0

自分でシリアル化しますか?私はそれに慣れていないことを期待していました...しかし、ActiveRecordsで動作しますか?もしそうなら、セッション自体にYamlを保存することができます... –

+0

はい、to_yamlはすべてのオブジェクトで動作します。あなたはどこにでもそれを保存することができます。私は解決策からコードをファイルに保存します。クラウドの種類は以下のようなものです。 obj.to_yamlはオブジェクトの部分的な状態を保存することを可能にします。 –

+0

通常、「フルハンド」オブジェクトと共にデータベースに部分オブジェクトを保存することは望ましくありません。 YAMLテキスト(id、yaml)を格納する単純なテーブルを作成し、それを使用します。 –