2013-04-18 63 views
0

在控制器中,我試圖訪問深度嵌套的參數。這是我的參數跟蹤。如何訪問Rails中的嵌套參數

Parameters:

{"utf8"=>"✓", 
"authenticity_token"=>"2j+Nh5C7jPkNOsQnWoA0wtG/vWxLMpyKt6aiC2UmxgY=", 
"inventory"=>{"ingredients_attributes"=>{"0"=>{"ingredient_name"=>"Bread"}}, 
"purchase_date"=>"11", 
"purchase_price"=>"11", 
"quantity_bought"=>"11"}, 
"commit"=>"Create Inventory"} 

我想從這個檢索 「麪包」。我試過params[:inventory][:ingredient][:ingredient_name]和其他變化。什麼是正確的styntax?

如果它的事項,

Inventory has_many :ingredients
Inventory accepts_nested_attributes_for :inventories

謝謝!

+0

http://stackoverflow.com/questions/14083654/elegantly-extracting-all-strings-from-an-arbitrarily-deep-hash - 也許這將幫助? – MC2DX 2013-04-18 02:46:35

回答

1

值「麪包」直接訪問會從字面上是:

params[:inventory][:ingredients_attributes]["0"][:ingredient_name] 

我敢打賭,你不想這樣做。

隨着accepts_nested_attributes_for和散列結構(也假定成分屬性的設置是否正確),你可以設置一個庫存實例和值「麪包」的PARAMS將被設置爲ingredient_name屬性的成分對象之一在聯想:

@inventory = Inventory.new(params[:inventory]) 
# or @inventory.attributes = params[:inventory] for an existing 
# inventory instance 

ingredient = @inventory.ingredients.first 
ingredient.ingredient_name 
# => "Bread" 
+0

我想做你的建議更正,但我有一個問題。我在我的'create'動作中寫這段代碼。如果我還沒有保存@inventory,「成分= @ inventory.ingredients.first」會起作用嗎? – 2013-04-18 03:17:21

+0

是的,它將在清單實例上設置屬性後在請求中工作,但除非成功調用'@ inventory.save',否則它不會被保留。 – rossta 2013-04-18 03:27:12

+0

真棒,謝謝! – 2013-04-18 03:58:53