Rails在视图中手动设置嵌套属性

时间:2014-09-19 17:20:16

标签: ruby-on-rails nested-attributes

我很难理解布局视图的方法,以便为嵌套表单正确嵌套属性。

我的参数看起来像这样......

Parameters: {"utf8"=>"✓",
  "authenticity_token"=>"retsty/G2I1FyYybXm9kVaZi+aPjQm4jsmLdLW3wxsc=", 
  "receipt"=>{"receipt"=>"", "receipt_date(1i)"=>"2014", "receipt_date(2i)"=>"9", "receipt_date(3i)"=>"19", 
  "po_receipts_attributes"=>[
    {"jobquote_order_id"=>{"3"=>"", "5"=>""}, "qty"=>"30"}, 
    {"qty"=>"11"}
  ]},
  "commit"=>"Receive"}

po_receipts_attributes数组未正确嵌套哈希。

格式:po_receipts_attributes: [{jobquote_order_id: <value>, qty: <value>}, {jobquote_order_id: <value>, qty: <value>}]

根据http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html,我的参数应该是这样的......

Parameters: {"utf8"=>"✓",
  "authenticity_token"=>"retsty/G2I1FyYybXm9kVaZi+aPjQm4jsmLdLW3wxsc=", 
  "receipt"=>{"receipt"=>"", "receipt_date(1i)"=>"2014", "receipt_date(2i)"=>"9", "receipt_date(3i)"=>"19", 
  "po_receipts_attributes"=>[
    {"jobquote_order_id"=>"3", "qty"=>"30"},
    {"jobquote_order_id"=>"5", "qty"=>"11"}
  ]},
  "commit"=>"Receive"}

我似乎无法在视图中正确嵌套属性。我为此尝试了许多不同的语法。

在我看来,我有以下代码......

= hidden_field "receipt[po_receipts_attributes][][jobquote_order_id]", jq_o.id
= text_field_tag "receipt[po_receipts_attributes][][qty]", ""

HTML输出......

<td>
  <input id="receipt_po_receipts_attributes__jobquote_order_id_3" name="receipt[po_receipts_attributes][][jobquote_order_id][3]" type="hidden" />
  <input id="receipt_po_receipts_attributes__qty" name="receipt[po_receipts_attributes][][qty]" type="text" value="" />
</td>
<td>
  <input id="receipt_po_receipts_attributes__jobquote_order_id_5" name="receipt[po_receipts_attributes][][jobquote_order_id][5]" type="hidden" />
  <input id="receipt_po_receipts_attributes__qty" name="receipt[po_receipts_attributes][][qty]" type="text" value="" />
</td>

处理此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

它应该是这样的:

jobquote_orders.each_with_index do |jq_o, i|
  = hidden_field_tag "recepit[po_receipts_attributes][#{i}][jobquote_order_id]", jq_o.id
  = text_field_tag "receipt[po_receipts_attributes][#{i}][qty]", ""

哪个应该生成参数:

"po_receipts_attributes" => {
  "0" => {"jobquote_order_id"=>"3", "qty"=>"30"},
  "1" => {"jobquote_order_id"=>"5", "qty"=>"11"}
}

您可以稍后保存(按照您在问题中指定的方式手动):

params[:receipt][:po_receipts_attributes].values.each do |v|
  pr = PoReceipt.find(v['jobquote_order_id'].to_s)
  pr.update_atributes(v.except('id'))
end

答案 1 :(得分:1)

你应该在内部[]内有一个整数,如:

= hidden_field "recepit[po_receipts_attributes][1][jobquote_order_id]", jq_o.id
= text_field_tag "receipt[po_receipts_attributes][1][qty]", ""

当Rails将表单主体解析为params哈希时,该整数是将属性保持在一起的结果。每组po_receipt_attributes都需要一个不同的ID。如果您要生成字段服务器端,则可以使用fields_for,并自动为您管理ID。

答案 2 :(得分:0)

尝试使用fields_for,如下所示:

<%= form_for @receipt do |receipt_form| %>
  <%= receipt_form.fields_for :po_receipts do |po_receipts_fields| %>
    <%= po_receipts_fields.hidden_field :jobquote_order_id, jq_o.id %>
    <%= po_receipts_fields.text_field :qty %>
  <% end %>
<% end %>