Rails AJAX:我的部分需要一个FormBuilder实例

所以我在我的Rails应用程序中有一个表单,它使用自定义FormBuilder为我提供一些自定义字段标记

 MyFormBuilder do |f| %> [...]  "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %> [...]  

现在,这个部分位于一个由AJAX回调替换的forms区域中。 我最终在控制器中响应AJAX请求做的是:

 render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member} 

但是,如果我这样做,那么表单就会中断,因为我在form_for中使用的FormBuilder对象不再可用。 有没有办法让我在用于AJAX回调的部分内部使用我的自定义FormBuilder对象?

在partial中使用fields_for 。 它执行类似的任务,但没有包装表单标签。 请参阅API文档 。

这个怎么样?

  @template.with_output_buffer do @template.form_for @model_object do |f| f.fields_for :some_nested_attributes do |ff| render :partial => 'nested_attributes', :object => @model_object, :locals => {:form => ff} end end end 

如果您需要在partial中使用嵌套的fields_for,这将特别有用

您可以在控制器中实例化表单构建器的新实例,尽管这对我来说有点糟糕:

 # in the controller render :partial => { :f => MyFormBuilder.new(:staff_member, @staff_member, template), :skill_groups => @skill_groups, :staff_member => @staff_member } 

或者,您可以将更多更新逻辑移动到客户端,这不需要您担心渲染任何内容。 您可以通过JS更新值。 不确定这是否适用于您的项目。

也许我在这里游戏有点晚了,也许我不能正确理解这个问题,但是在ApplicationHelper.rb中我想你可以添加一行:

 ActionView::Base.default_form_builder = MyFormBuilder 

你可以在你的ajax调用中提交f.object_name的内容(它也适用于partials)并使用它来呈现在http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html中定义的标签,并将其传递给第一个论点。