2010-11-18 17 views
2

的多个对象这是希望为Rails行家扣篮:梁2:使用的form_for构建形成覆盖同一类

我有一个应该遍历一组LineItems和收集表格每个信息。我试图让form_forfields_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" /> 

然而什么,我试图让(和faili除了回到专门的HTML标签以外寻找任何解决方案)是由line_item.id索引的字段名称,例如, line_item [1928] [rma_qty]等。这将允许我的控制器遍历每个line_item并用给定的参数更新它。

  • ...也许一个纯粹的REST UI,形式应与的LineItem一个实例,以及标准的form_for会工作 - 但用户应该能够一次与一个表单提交的所有更改。可能吗?

回答

0

的fields_for需要被调用的主要形式帮手,魔法[]个字符串参数,并指明实例应在[] 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解释了我想要的魔法支架的效果 - 除此之外,找不到这个功能记录在任何地方。

1

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

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

通过调用fields_for独自一人,你是从form_for打破链并因此出现错误的字段名称。

+0

没有得到我的参数line_item.id,但你是对的,它让我走下去了解fields_for实际上是如何工作的 - 尽管它有时候看起来很奇怪 - 谢谢! – sbeam 2010-11-18 21:23:37

+0

@sbeam我的不好,我错过了'fields_for'的第一个参数。我认为在这些助手中使用模型参考的符号稍微更具可读性。 – 2010-11-19 01:39:20