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

Rails 2:使用form_for构建一个覆盖同一类的多个对象的表单

  •  2
  • sbeam  · 技术社区  · 14 年前

    希望这是一个铁轨专家的扣篮:

    我有一个表单应该在一组 LineItems 收集每个人的信息。我想得到 form_for fields_for 创建合适的字段名和参数,给我的控制器一个params散列

    params[:line_items] = { <line_item.id> => { :rma_reason => "some string", :rma_qty => 2 } }
    

    我所拥有的是:

    <% form_for(@object) do |rma_form| %>
      <% @order.line_items.each do |item| %>
      ....
        <% fields_for item do |item_f| %>
          <%= item_f.text_area :rma_reason %>
          <%= item_f.text_field :rma_qty, :value => item.quantity, :size=>3 %>
        <% end %>
      ....
      <% end %>
    <% end %>
    

    生成的HTML看起来像(我猜你会想到的是):

    <textarea id="line_item_id" name="line_item[id]"></textarea> 
    <input id="line_item_rma_qty" name="line_item[rma_qty]" size="3" type="text" value="1" />
    

    然而 我试图得到的(除了回到特别的HTML标记之外,没有找到任何解决方案)是,字段名由 line_item.id 例如,行项目[1928][rma U数量]。这将允许我的控制器遍历每一行项目并用给定的参数更新它。

    • ... 也许在纯REST UI中,表单应该绑定到 LineItem ,并且标准表单可以工作-但是用户应该能够使用一个表单同时提交所有更改。有可能吗?
    2 回复  |  直到 14 年前
        1
  •  1
  •   Adam Lassek    14 年前

    在嵌套表单字段时,必须确保链接 fields_for 方法形成适当的表单生成器:

    <% rma_form.fields_for :line_item, item do |item_f| %>
    

    通过打电话 字段 独自一人,你打破了锁链 form_for 因此字段名不正确。

        2
  •  0
  •   sbeam    14 年前

    需要在主窗体助手上调用的字段,以及带有magic的字符串参数 [] 和一个参数,该参数指示应在 [] s公司

    <% rma_form.fields_for "line_item[]", item do |item_f| %>
    

    所以现在我的标签看起来像

    <input id="return_authorization_line_item_1070870205_rma_qty" name="return_authorization[line_item][1070870205][rma_qty]" size="3" type="text" value="1" />
    

    那是桃子。

    classic railscast 是一个很好的介绍领域,而且 this comment 解释了魔法支架的效果,它实现了我想要的——除此之外,在任何地方都找不到这个功能的文档。