2014-09-19 80 views
0

我很難理解佈局視圖的方式,以便爲嵌套窗體正確嵌套屬性。Rails手動設置視圖中的嵌套屬性

我PARAMS這個樣子......

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,我的PARAMS應該是這樣的......

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

應該是這樣的:

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]", "" 

這應該產生PARAMS:

"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 
+0

謝謝你的解決方案。你能夠允許accept_nested_attributes_for'自動處理它的語法嗎?我想過使用這樣的索引,但是因爲它沒有遵循API文檔,所以這看起來不正確。由於返回的記錄集,我需要手動創建視圖(我認爲),或者我會使用'fields_for'。 – Beengie 2014-09-19 18:07:46

+0

是的,我可以推測。如果你使用'accept_nested_attributes',那你爲什麼要手動設置它們呢?由於返回的記錄集而導致「 – Surya 2014-09-19 18:08:48

+0

」。我需要測試訂單,看它是否在它被包含在表單中之前關閉。 – Beengie 2014-09-19 18:11:18

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將自動爲您管理。

+0

[http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html](http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)示出了屬性排列我的目標。在我問這個問題之前,我曾嘗試將'jq_o.id'放在'[]'中,但是我沒有看到API文檔。我很困惑。 – Beengie 2014-09-19 17:38:09

+0

當我將'jq_o.id'放置在'[]'中時,我得到...''po_receipts_attributes「=> {」3「=> {」jobquote_order_id「=> {」3「=>」「}} ,「qty」=>「30」},「5」=> {「jobquote_order_id」=> {「5」=>「」},「qty」=>「11」}}' – Beengie 2014-09-19 17:44:46

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 %> 
+0

謝謝穆罕默德。我之所以走這條路線,是因爲我將另一張桌子上的數據轉化爲我在這裏沒有列出的組合。 jobquote_orders是一個多對多的表格,它正在推動開放訂單的潛在po_receipts的數量。 – Beengie 2014-09-19 20:27:02