2011-11-25 14 views
9

fields_forがActiveRecord以外のモデルの配列属性で機能するのに問題があります。form_for非ARモデル - fields_for配列属性が反復しない

がダウンして蒸留、私は次のようにあります。

モデル/ parent.rb

class Parent 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 
    extend ActiveModel::Translation 

    attr_accessor :bars 
end 

コントローラ/ parent_controller.rb

def new_parent 
    @parent = Parent.new 

    @parent.bars = ["hello", "world"] 
    render 'new_parent' 
end 

ビュー/ new_parent.html.haml

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars, @parent.bars do |r| 
    = r.object.inspect 

上記のコードでは、私のページに["hello", "world"]が含まれています。つまり、barsに割り当てられた配列で呼び出されたinspectの結果です。 (@parent.barsfields_for行から省略すると、nilが表示されます)。

fields_forをAR関連として動作させるにはどうすればよいですか?すなわち、barsアレイのメンバーごとに1回ブロック内のコードを実行しますか?

+0

これはありがとうございます。私は誰もこれをやろうとしていたとは思わなかった!ありがとう...たくさん! – Nitrodist

答えて

11

私は正しい技術を考えるのである:それはちょうど仕事に行うことができない理由

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each do |bar| 
    = f.fields_for "bars[]", bar do |r| 
     = r.object.inspect 

かなり私はわからないんだけど、これはトリックを行うようです。

1

私はそれが各を必要とせずに行うことができると思う:

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars do |r| 
    = r.object.inspect 

あなたは、コレクションを識別するために、親クラスに期待されているいくつかのメソッドを設定する必要があります。

class Parent 
    def bars_attributes= attributes 
    end 
end 

そして、あなたはまた、配列内のオブジェクトは、(あなたが文字列を使用することはできません)持続:(

0

私はfields_forを不時着し、複数の追加に応じることを確認する必要があります:真

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each_with_index do |bar, i| 
    = f.text_field :bars, value: bar, multiple: true, id: "bar#{i}"