2011-06-08 23 views
3

這與Trying to extend ActionView::Helpers::FormBuilder類似,但我不想使用:builder => MyThing。如何正確的擴展form_for/ActionView :: Helpers :: FormBuilder?

我想擴展表單生成器以添加自定義方法。這是當前形勢:

module ActsAsTreeHelpers 
    def acts_as_tree_block(method, &block) 
    yield if block_given? 
    end 

end 


ActionView::Helpers::FormBuilder.send :include, ::ActsAsTreeHelpers 

控制檯:

ruby-1.9.2-p180 :004 > ActionView::Helpers::FormBuilder.included_modules 
=> [ActsAsTreeHelpers, ...] 

但下面給我:undefined method acts_as_tree_block for #<ActionView::Helpers::FormBuilder:0xae114dc>

<%= form_for thing do |form| %> 
    <%= form.acts_as_tree_block :parent_id, {"test"} %> 
<% end %> 

缺少什麼我在這裏?

回答

5

我也有同樣的問題。 我試圖在我的項目文件夾config/initializers中添加一個名爲form_builder.rb的新文件,現在它運行良好。

下面是我的解決方案的一些內容。 base_helper.rb

def field_container(model, method, options = {}, &block) 
    css_classes = options[:class].to_a 
    if error_message_on(model, method).present? 
    css_classes << 'withError' 
    end 
    content_tag('p', capture(&block), :class => css_classes.join(' '), :id => "#{model}_#{method}_field") 
end 

form_builder.rb

class ActionView::Helpers::FormBuilder 
    def field_container(method, options = {}, &block) 
    @template.field_container(@object_name,method,options,&block) 
    end 

    def error_message_on(method, options = {}) 
    @template.error_message_on(@object_name, method, objectify_options(options)) 
    end 
end 
ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "<span class=\"field_with_errors\">#{html_tag}</span>".html_safe } 

_form.html.erb

<%= f.field_container :name do %> 
    <%= f.label :name, t("name") %> <span class="required">*</span><br /> 
    <%= f.text_field :name %> 
    <%= f.error_message_on :name %> 
<% end %>