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

时间:2010-11-18 20:26:13

标签: ruby-on-rails

希望这对Rails maven来说是一个扣篮:

我有一个表格应该迭代一组LineItems并收集每个表格的信息。我试图让form_forfields_for创建正确的字段名称和参数,以便为我的控制器提供一个类似于

的参数哈希
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" />

然而我想要获得的(并且无法找到任何解决方案,而不是回到ad-hoc HTML标记)是由line_item.id索引的字段名称,例如例如,line_item [1928] [rma_qty]。这将允许我的控制器迭代每个line_item并使用给定的参数更新它。

  • ...也许在纯REST UI中,表单应该绑定到LineItem的一个实例,标准form_for可以工作 - 但是用户应该能够一次性提交所有更改形成。有可能吗?

2 个答案:

答案 0 :(得分:1)

当您嵌套表单字段时,您必须确保从相应的表单构建器链接fields_for方法:

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

仅通过调用fields_for,就会打破form_for链,从而破坏不正确的字段名称。

答案 1 :(得分:0)

需要在主表单帮助程序上调用fields_for,并使用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是一个很好的fields_for简介,而this comment解释了魔术支架的效果,它做了我想要的 - 除此之外,无法在任何地方找到此功能。