2014-12-19 52 views
1

以下數組["2", "8", "134", "137", "140"]通過用戶輸入生成。控制器動作調用陣列如下:訪問正確的數組值

params[:product_ids].each do |product_id| 
    @product = Product.where('id = ?', product_id).first 
end 

不幸的是在視圖中調用時的值(對於開發控制的目的)

<% params[:product_ids].each do |t| %> 
    <%= t %> <%= @product.id %><br /> 
<% end %> 

正在呈現適當的值t但然後將其與相關聯140五次。

2 140 
8 140 
134 140 
137 140 
140 140 

因此訪問數組的最後一項並忽略密鑰。當這種嘗試在控制器:

params[:product_ids].each do |k, product_id| 

它返回Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

如何控制被定義爲適當的訪問參數的值?

回答

2

你是在一個循環中相同的變量assinging值,把它的循環之外,並使用#map得到的值作爲所有產品ID的交易模式,所以:

@transactions = params[:product_ids].map do |product_id| 
    [ Transaction.where(product_id: product_id).first ] 
end 

然後:

<%= @transactions %> 
+0

@Malo。該語法確實生成數據。令我感到意外的是'<%= @products%>''返回了'[「2」,#<產品ID:2,struttura_id:1,'[「8」,#<產品ID:8 ,struttura_id:1,'等換句話說,該值,後面跟着對象的數據。然後,如果我想循環遍歷每個記錄並創建新記錄,請使用@@products.each do | product | params [:transaction] [:product_id] = product.id @transaction = Transaction.new(params [:transaction]'我不能這樣訪問一個數組... – Jerome 2014-12-20 19:59:05

+0

@Jerome好,你想得到什麼? =) – 2014-12-20 20:06:13

+0

@Malo產品的ID ...但我相信我的推理陷入了一個循環陷阱。使用'params [:product_ids] .each do | product_id |'會更直接params [:transaction]'... – Jerome 2014-12-20 20:40:04

2

在這一段代碼:

params[:product_ids].each do |product_id| 
    @product = Product.where('id = ?', product_id).first 
end 

要更新@product實例變量n倍(其中,n是params[:product_ids]表的大小)。最後,@product實例變量包含Product的id,它是最後一個元素params[:product_ids],在你的情況下它是140。我想這會更好,如果你設置的產品陣列,像這樣:

@products = Product.where(id: params[:product_ids]) 

,所以你可以在它們之間迭代:

<% @products.each do |product| %> 
    <%= product.id %> 
<% end %> 
+0

這是語法'Product.where(ID:PARAMS [:product_ids])'正確?我以前沒有遇到過嗎? – Jerome 2014-12-19 09:44:10

+0

@Jerome這是正確的。它使用'IN'子句生成SQL。 – 2014-12-19 09:45:09

+0

這是產生'產品負載(2.7毫秒)選擇「產品」。*從「產品」WHERE「產品」。「id」IS NULL'並且只有一次...(postgresql是db) – Jerome 2014-12-19 11:03:23

0

當您使用

params[:product_ids].each do |product_id| 
    @product = Product.where('id = ?', product_id).first 
end 
# you set @product = 2 
# @product = 8 
# ... 
# @product = 140 last value of @product is 140 

解決方案

@products = params[:product_ids].map do |p_id| 
    {p_id => Product.find_by(id: p_id)}  
end 

在你看來

<% @products.each do |k, v| %> 
    <%= k %> <%= v %><br /> 
<% end %> 
+1

'Product.find_by(p_id)'不起作用,它應該是'Product.find_by(id: p_id)'或'Product.find_by_id(p_id)'。 – 2014-12-19 09:24:43

+1

nope,沒有列名的'find_by'行爲不像'find_by(id:p_id)',至少在4.1.6。 – 2014-12-19 09:43:48

+0

You are right,I wa如果你使用postgresql的話,它會返回DB – Nermin 2014-12-19 09:46:31