代码之家  ›  专栏  ›  技术社区  ›  Gareth

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

  •  15
  • Gareth  · 技术社区  · 16 年前

    所以我的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}
    

    但是,如果我这样做,那么表单将中断,因为我在表单\中使用的FormBuilder对象不再可用。在用于Ajax回调的部分中,我是否可以使用自定义FormBuilder对象?

    5 回复  |  直到 16 年前
        1
  •  14
  •   Edd    16 年前

    使用 fields_for 在你的部分里面。它执行类似的任务,但不包装表单标记。见 API docs .

        2
  •  2
  •   David Lowenfels    14 年前

    这个怎么样?

      @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
    

    这将特别有用,因为您需要在

        3
  •  1
  •   nakajima    16 年前

    您可以在控制器中实例化表单生成器的新实例,尽管我觉得这有点糟糕:

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

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

        4
  •  1
  •   Samo    14 年前

    也许我在游戏中有点晚了,也许我不太理解这个问题,但是在applicationhelper.rb中,我认为你可以添加一行:

    ActionView::Base.default_form_builder = MyFormBuilder
    
        5
  •  1
  •   Kadu Diógenes    11 年前

    您可以在Ajax中提交f.object_name的内容(它也可以与partials一起使用),并使用它来呈现在中定义的标记。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html 将其作为第一个参数传递。