2012-02-02 77 views
0

我有一個嵌套窗體和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 

誰能告訴我我做錯了什麼?

感謝

回答

1

找到我自己的答案。原來我一直在做這樣的:

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

其次:

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

我不需要panel_fields_for可言。

1

看的fields_for定義:

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

當你調用fields_for與塊作爲參數,紅寶石將無法找出您指​​定的options參數實際上是選擇,而是認爲它是record_object參數。

您只需通過nil作爲第二個參數,你的自定義生成器將被實例化:

fields_for(object, nil, options, &block) 

這可以很好的情況下,知道你沒有訪問的建設者對象形式,就像您從單獨的yield塊創建一些字段一樣。

相關問題