2017-08-22 3 views
0

Fooのような二重にネストされたアソシエーションがあり、Barが多く、Bazのものがたくさんあります。 Bazモデルには、というシリアル化フィールドがあり、範囲(つまり、1..3)を数値にマッピングするハッシュの形式をとります。あなたは、私が文字列としてハッシュを扱う、および編集ページ内のテキストボックスでそれをレンダリングしています見ることができるように複数の入力をActive Adminのルビーハッシュに結合

form do |f| 
    f.semantic_errors 
    f.has_many :bars, heading "Bar" do |t| 
     f.input :item_one 
     f.input :item_two 
     t.has_many :bazs do |r| 
      r.input :name 
      r.input :data, as: :string 
     end 
    end 
end 

{ (1..3) => 42 }

は、現在アクティブな管理編集ページに私のようなものを持っています。私はすでに存在するデータをループして別々のテキストボックスにレンダリングして、個々に編集したり削除したりできるようにしたいと思っています...しかし、フォームを提出すると、これらの入力を結合してデータをハッシュ文字列ではなくむしろ。

これはカスタムフォームビルダーを作成することで可能ですか?最善のアプローチは何ですか?

コードをモデルに書き込む必要のない、拡張可能なソリューションを構築したいと考えています。更新o//

を読み取るための

感謝: 私は私の作品解決策を見つけました。ここで問題となっていたのは、データがデータベースに配置されたときにハッシュから文字列にシリアル化されていたため、ユーザーがこのデータをJSONとして編集し、データを取得するモデルでsetterメソッドを変更できるようにしたJSONを解析します。これは、私がちょうどこの JSON editor widgetを使用して、データを編集するための素敵なUIを与えることができたので、物事をより簡単にしました。このトリックは、「Add New Item」ボタンで作成されたアイテムにウィジェットを適用する方法を学ぶことでした。 active admin source codeを見ると、has_many_add:afterイベントにフックして、追加された要素が既にDOMツリーに追加された後にJSONエディタを適用できることを学びました。

+0

私は通常、モデルに仮想属性を追加することでこれを行います。ヘルパーとビューにコードを保存することについてどの程度強く感じていますか? – moveson

答えて

0

decoratorを使用してフォームから変換を試して非表示にします。そうでなければhstore editorはあなたにインスピレーションを与えるかもしれません。カスタムフォームビルダー、特にネストされたhas_manyを使用することをお勧めします。

+0

私は正しい方向に向いてくれてありがとう! – dynsne