未在fields_for方法中调用自定义窗体生成器

问题描述:

我有一个嵌套窗体和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 

谁能告诉我我做错了什么?

感谢

找到我自己的答案。原来我一直在做这样的:

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

其次:

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

我不需要panel_fields_for可言。

看的fields_for定义:

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

当你调用fields_for与块作为参数,红宝石将无法找出您指​​定的options参数实际上是选择,而是认为它是record_object参数。

您只需通过nil作为第二个参数,你的自定义生成器将被实例化:

fields_for(object, nil, options, &block) 

这可以很好的情况下,知道你没有访问的建设者对象形式,就像您从单独的yield块创建一些字段一样。