未在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
块创建一些字段一样。