0

親モデルと、別のモデルの潜在的に複数の子のネストされた属性を持つRailsフォームがあります。

子モデルには、配列としてロジックで操作される属性がありますが、Rails 組み込みの serialize メソッドを使用して YAML 文字列にシリアル化されます。

フォーム内で、ユーザーがメンバーを選択的に削除できるように、配列の個々のメンバーを表示します。

ユーザーがすべてのメンバーを破棄すると、問題が発生します。フォームは param の値を Rails コントローラに渡さず、UPDATE アクションが呼び出されると、フォームの params ハッシュにキーがないため属性を無視します。もちろん、これはチェックボックスなどの既知の問題であるため、Rails はチェックボックスごとに 2 つのチェックボックス HTML 要素を自動的に配置します。

ここではチェックボックスではなく、非表示の入力テキスト フィールドを扱います。

私が実装した解決策は、次のように、コントローラーの UPDATE アクションで params ハッシュを直接操作することです。

params[:series][:time_slots_attributes].each { |k,v| v[:exdates] ||= [] }

これはコードのにおいと見なされますか?

代わりに、無効になっていて、ユーザーが最後のメンバーを削除したときにのみ有効になる隠しフィールドを追加する必要がありますか? この解決策も同様に機能しますが、私には扱いにくいようです。

4

2 に答える 2

1

これは、NestedAttributes モジュールで、「_destroy」パラメーターが特定のネストされた属性の破棄呼び出しをトリガーできるようにすることで処理されます。

http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for .

ネストされた属性を使用していない場合 (おそらく使用する必要がありますが、多くの状況では非常に適切です)、はい、どの値が存在する必要があるかを調べて、何か特別なことを行うことで、自分で何かをハンドロールする必要があります。それらの。

于 2012-07-13T17:46:34.370 に答える
0

これは完全な答えではありません...しかし、この問題について考えてみると、同じ UPDATE アクションを利用する将来のフォームが構築された場合、予想外の動作が発生し、最小の驚きの原則に違反することがわかります。後で、exdates 属性の値を変更することを期待しない 2 番目のフォームが作成された場合 (値が渡されないため)、UPDATE アクションは属性に空の配列を書き込みます。

この問題を解決するには、真のブール値を持つ非表示のフォーム フィールドを 1 つ追加し、後ですべてのタイム スロット exdates を空の配列に設定する前にこの値を確認します。このようにして、将来の開発者がシリーズ コントローラーの UPDATE アクションを利用する新しいフォームを作成した場合、exdates が空の配列に設定されるという予期しない動作が発生することはありません。フォームで exdates を処理したい場合は、同じ非表示のフォーム フィールドに true の値を設定する必要があります。これは、exdates、migration、および AR 関連付け用のクラスとテーブルを追加し、ネストされた属性の別のレイヤーを追加して、親と子の属性だけでなく、親、子、および孫を配置する、より単純なソリューションのように思えました。

于 2012-07-13T17:42:51.797 に答える