在Ruby on Rails中循环遍历数组的麻烦?

时间:2014-01-05 01:58:30

标签: ruby-on-rails ruby arrays

我正在学习Ruby和Rails,并且教程一直在说我应该首先在控制器中设置所有ERB文件所需的内容。我遇到了一些问题。

我从API获取产品目录,然后我回来了一个数组。这是它的开始:

[{"Name"=>"3x4 Vinyl Magnet", "Description"=>"Made of durable high-gloss vinyl. Measures 3x4 inches and has rounded corners. Waterproof and scratch resistant.", "UnitPrice"=>8.99, "ProductCode"=>"Gift65001"

还有更多产品。

在我的控制器文件中,我有:

@http_party_json = JSON.parse(@response.body)

@http_party_json.each do |i|
  i.each do |x|
    @just_products = x['Products']
  end
end

@just_products.each do |grab|
  @product_code = grab['ProductCode']; @product_code.delete! ';'
  @just_names = grab['Name']
  @just_prices = grab['UnitPrice']
  @just_descriptions = grab['Description']
end

我的ERB文件是:

<div class="large-12 columns">
  <div class="row">
<% @just_products.each do %>
    <div class="large-3 columns panel radius" style="height: 600px"><h2><%= @just_names %></h2><br><h3><%= @just_prices %></h3><br>
    <p><%= @just_descriptions %></p>
    <button id="<%= @product_code %>">Add to Cart</button>
    </div>
  <% end %>
</div>

它正在显示数组中的最后一项,以显示它带回的每个结果。如果我将grab循环从控制器传输到ERB文件,它可以正常工作,但我想学习如何正确地完成它。

2 个答案:

答案 0 :(得分:2)

有理由显示最后一个是因为你循环遍历数组并且每次都覆盖ivar。因此,当你到达数组中的最后一项时,你已经覆盖了前一项。

您希望避免在视图中执行的主要操作是进行SQL查询。在这里,您已经将所有内容加载到数组中,这就足够了。

<div class="large-12 columns">
  <div class="row">
<% @just_products.each do |product| %>
    <div class="large-3 columns panel radius" style="height: 600px"><h2><%= product['Name'] %></h2><br><h3><%= product['UnitPrice'] %></h3><br>
    <p><%= product['Description'] %></p>
    <button id="<%= product['ProductCode'].delete!(';') %>">Add to Cart</button>
    </div>
  <% end %>
</div>

答案 1 :(得分:2)

我应该首先在控制器中设置一切,以便我的erb文件需要

我看到了麻烦...这是一个解释这本书试图说的内容的问题。在你的代码中,这个块,

@just_products.each do |grab|

并且其中的所有作业实际上都没有为您做任何事情。旋转@just_products.each之后,它对@just_descriptions的最终分配仅仅是@just_products中“描述”的最后一个值,这是您在视图中看到的内容。

这本书只是说要准备erb视图所需的一切。这并不能转化为“在控制器中明确分配每个可能的变量”。将@just_products传递给您的视图并在其中旋转(通过.each)是完全可以接受的。

如果您不想这样做,您的备选方案是在控制器中构建代码,名称,描述等数组。然后在视图中旋转其中的每一个。在这种情况下,这一行:

@just_descriptions = grab['Description']

看起来更像是:

@just_descriptions << grab['Description']