2011-02-17 87 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默认为常规形式的助洗剂。