1

Railscast 197 (ここではASCIIcast )のネストされたモデル フォーム テクニックを使用しています。しかし、セットアップで問題が発生しています。ネストされたモデルのパーシャルの 1 つにカスタム フォーム ビルダーを使用する必要があります。link_to_add_fields_helper を次のように変更することで、機能するようになりました...

def link_to_add_fields(name, f, association)  
  new_object = f.object.class.reflect_on_association(association).klass.new  
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}", :builder => AnswerFormBuilder) do |builder|
  #was...
  #fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
    render(association.to_s.singularize + "_fields", :f => builder)  
  end  
  link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))  
end

両方のネストされたモデルを AnswerFormBuilder に設定することで、私の問題は少し解決しましたが、質問と回答の両方がそれらを必要としないため、あまりエレガントではありません。さらに、アプリケーション全体のフォームビルダーをやりたいところまで来ました。2 番目の質問は、どうすればカスタム フォーム ビルダーを「ネスト」できますか? つまり、AnswerFormBuilder に、ApplicationFormBuilder が持つすべてのメソッドと、Answers 用のその他の特別なメソッドを実装させます。どうもありがとう、私はいたるところを見たり、他のブログで質問したりしましたが、まだ答えはありません.

4

1 に答える 1

1

数ヶ月後、私はそれを理解しました...

def link_to_add_fields(name, f, association, options = {})  
  new_object = f.object.class.reflect_on_association(association).klass.new  
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}", :builder => options[:builder]) do |builder|
    render(association.to_s.singularize + "_fields", :f => builder)  
  end  
  link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))  
end

次に、カスタム フォーム ビルダーが必要なときに、pass link_to_add_fields を呼び出して、キー :builder と特定のビルダーの値を指定します。

link_to_add_fields "Add Question", f, :questions, :builder => QuestionFormBuilder

ハッシュ (または :builder キーと値のペア) が link_add_fields に渡されない場合、fields_for メソッドはデフォルトで通常のフォーム ビルダーになります。

于 2012-05-02T19:39:57.137 に答える