2012-02-02 12 views
0

私は3つの関連モデルでネストされたフォームを持っています。カスタムフォームビルダPanelFormBuilderですべてのフィールドを作成したい。ただし、form_forはフォームビルダーで処理されており、fields_forは処理されません。デフォルトの処理で処理されます。なぜ私は私の人生のために働くことはできません。fields_forメソッドでカスタムフォームビルダーが呼び出されていません

これは動作します:

<%= panel_form_for @firm do |f| %> 

これはしていません:

ここ
<%= panel_fields_for @firm.company do |c| %> 

は、カスタムメソッドです:ここ

module ApplicationHelper 
    def panel_form_for(object, options = {}, &block) 
    options[:builder] = PanelFormBuilder 
    form_for(object, options, &block) 
    end 

    def panel_fields_for(object, options = {}, &block) 
    options[:builder] = PanelFormBuilder 
    fields_for(object, options, &block) 
    end 
end 

は、カスタムフォームビルダは

class PanelFormBuilder < ActionView::Helpers::FormBuilder 
    delegate :content_tag, :tag, to: :@template 

    %w[text_field text_area password_field].each do |method_name| 
    define_method(method_name) do |name, *args| 
     options = args.extract_options! 
     options.merge!(:class => "required") 
     super(name, *(args + [options])) 
    end 
    end 
end 
です

誰かが私が間違っていることを教えてもらえますか?

ありがとうございました

答えて

1

私自身の答えが見つかりました。私はこれをやっているはずですが判明:私は全然panel_fields_forを必要としない

<%= f.fields_for :company do |c| %> 

<%= panel_form_for @firm do |f| %> 

が続きます。 fields_forの定義で

1

ルック:あなたは、引数としてブロックでfields_forを呼び出すと

fields_for(record_name, record_object = nil, options = {}, &block) 

、ルビーではなく、指定したoptionsパラメータが実際にオプションであることを把握することはできますが、ではないだろうそれがrecord_objectパラメータだと思います。

あなただけの2番目のパラメータとしてnilを渡すことができ、およびカスタムビルダーがインスタンス化されます。

fields_for(object, nil, options, &block) 

これは、あなたがのビルダーオブジェクトへのアクセスを持っていない状況で知ることが良いことができますフォームは、別のyieldブロックからいくつかのフィールドを作成したときのように表示されます。