2011-02-17 84 views
1

我使用Railscast 197(ASCIIcast here)的嵌套模型窗體技術。但是我的設置遇到了問題,我需要爲我的一個嵌套模型的部分使用自定義表單生成器。我找到了工作,排序,由modifiying的link_to_add_fields_helper,像這樣......在Ruby on Rails中使用自定義窗體構建器與嵌套模型

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看到,但它不是因爲這兩個很優雅問題和解答不需要它們。此外,我已經到了一個我想要創建應用程序範圍表單構建器的地步。這讓我想到了第二個問題,我該如何「嵌套」自定義表單構建器?即使用AnswerFormBuilder實現ApplicationFormBuilder將具有的所有方法,以及用於Answers的其他一些特殊方法。非常感謝,我到處尋找,並在其他博客上詢問,但沒有答案。

+0

我問我的問題的博客是[這裏](http://blog.madebydna.com/all/code/2010/12/31/dynamically-nesting-deeply-nested-forms.html#comment-139604408 )。 (由於我的信譽低,無法發佈超過2個鏈接...) – 2011-02-17 21:13:27

回答

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 

後來,當我當我需要一個自定義表單生成器我只是叫通link_to_add_fields與鍵的哈希:具體建設者的建設者和價值。

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

如果沒有散列(或無:助洗劑密鑰值對)被傳遞到所述link_add_fields方法fields_for默認爲常規形式的助洗劑。