2012-03-20 7 views
1

バックエンド:別のモデル(ContactPreference)のhas_manyというモデル(User)があります。 フロントエンド:ユーザーが特定のユーザーの連絡先設定を並べ替え、追加、削除できるようにするインターフェイス。Rails 3フォームデータからネストされた属性を再構築する

私は、ユーザーが1回のフォーム送信ですべての変更を一度にコミットするようにしたいと思います。私がこれをやっているところは、Userモデルのallows_nested_attributes_for :contact_preferencesであり、編集された設定リストの属性を簡単にポストしています。それはうれしいバグを除いてうまくいきます:ユーザがコンタクトプリファレンスを削除した場合、IDは単に送信されず、プリファレンスはDBから削除されません。

allows_nested_attributes_forは、コレクションからオブジェクトを削除する機能をサポートしていますが、クライアントは削除されたIDを追跡し、'_destroy' => 1パラメータを渡す必要があります。これは私がむしろ避けるだろう厄介なロジックです。オブジェクトに明示的に含まれていない限り、オブジェクトを削除したいだけです。 allows_nested_attributes_forは私が知る限りこの動作をサポートしていないので、私自身のソリューションを実装しようとしています。

この種の更新を行う最も効率的な方法(データベースアクセスの点で)は何ですか?すべてを削除してリストをゼロから再構築しますか?アソシエーションをロードし、明示的に含まれていないオブジェクトを選択しますか?おそらく、私が使うことができる巧妙なActiveRecordの魔法がありますか?

答えて

1

私の個人的な気持ちは、:destroy => 1フラグを使用してこれを行うと、代替案よりもずっと面倒ではありません。代わりに、サーバー上で関連付けをロードし、受信パラメータを比較し、欠落しているレコードを見つけ出し、欠落しているレコードを削除し、残りのレコードを更新することができます。これは余分なロジック、DB操作、そして最悪の場合の多くですが、を手作業で手直しする必要がありますが、それは簡単なことではありません。

HTML JSなしでこれを達成するためのちょっとしたトリック/ハックをあなたに与えます。名前が:destroyの各レコードにチェックボックスを追加します。高レベルのフォームヘルパーを使用します(例: check_boxではなく、(多くのことを手動で行う必要があります)またはsimple_form gemなどの上位レベルのフォームヘルパーではありません。

フラグがチェックされていない場合、HTMLは何も送信せず、レコードはそのまま残ります。フラグがチェックされている場合、HTMLは:destroyフラグを送信し、組み込みのサーバー側のメカニズムをそのまま使用して削除されます。

フロントエンドコードについてはあまり言いませんでした。あなたはそこにJSの束を持っているように聞こえる。ユーザーがレコードを「削除」したときにレコードを非表示にしている場合は、上のチェックボックスの方法を使用しない場合は、destroyフラグをプログラムで追加することができます。これはバックエンドの振る舞いを第二に推測しようとするよりはるかに単純で、エラーの傾向が少なくなります。

関連する問題