1

我正在使用Railscast 197中的嵌套模型表单技术(此处为ASCIIcast )。但是我的设置遇到了问题,我需要为我的嵌套模型的一个部分使用自定义表单构建器。通过修改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 我有点解决了我的问题,但它不是很优雅,因为问题和答案都不需要它们。此外,我已经到了想做一个应用程序范围的表单构建器的地步。这让我想到了第二个问题,我如何“嵌套”自定义表单构建器?即让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 回答