15

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

<% form_for :staff_member, @staff_member, :builder => MyFormBuilder do |f| %>
[...]
    <%= render :partial => "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %>  
[...]
<% end %>

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

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

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

4

5 回答 5

15

fields_for在你的局部使用。它执行类似的任务,但不包装表单标签。请参阅API 文档

于 2009-01-02T12:43:46.967 回答
2

这个怎么样?

  @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

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

于 2010-10-18T22:56:03.500 回答
1

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

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

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

于 2009-01-01T20:31:08.173 回答
1

也许我在这里的游戏有点晚了,也许我没有正确理解这个问题,但是在 ApplicationHelper.rb 我认为你可以添加以下行:

ActionView::Base.default_form_builder = MyFormBuilder
于 2010-10-22T14:51:48.673 回答
1

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

于 2013-11-19T23:15:34.790 回答