访问正确的数组值

时间:2014-12-19 09:15:15

标签: ruby-on-rails ruby arrays

通过用户输入生成以下数组["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

如何定义控制器以正确访问参数的值?

3 个答案:

答案 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 %>