通过用户输入生成以下数组["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
如何定义控制器以正确访问参数的值?
答案 0 :(得分: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 %>
答案 1 :(得分:2)
您将循环中的值分配给同一个变量,将其放在循环外部,并使用#map
将值作为所有产品ID的事务模型,因此:
@transactions = params[:product_ids].map do |product_id|
[ Transaction.where(product_id: product_id).first ]
end
然后:
<%= @transactions %>
答案 2 :(得分: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 %>