我正在学习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文件,它可以正常工作,但我想学习如何正确地完成它。
答案 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']