迭代Rails5中的JSON数组

时间:2017-10-11 16:37:36

标签: ruby-on-rails json ruby ruby-on-rails-5

我知道我遗失的东西可能非常明显。我试图在我的Rails5视图中迭代JSON数组。我尝试了几件事,但似乎无法获得正确的渲染项目。以下代码将{"name"=>"Large Plaque", "price"=>"2500"} {"name"=>"Small Plaque", "price"=>"1500"}呈现给我的视图。

配置/ plaque_data.json

{
  "products": [
    {
      "name": "Large Plaque",
      "price": "2500"
    },
    {
      "name": "Small Plaque",
      "price": "1500"
    }
  ]
}

控制器/ plaqueorders_controller.rb

...
def new
 @plaqy = JSON.load File.read('config/plaque_data.json')
end
...

视图/ plaqueorders / new.html.erb

...
<% @plaqy['products'].each do |k, v| { name: k, price: v } %>
 <%= k %>
<% end %>
...

2 个答案:

答案 0 :(得分:2)

由于'k'是哈希值,您需要访问k ['name']和k ['price']来提取价格和名称。

此外,当您在数组上使用.each时,通常只声明一个块参数(您有两个,k和v)。

你通常会为Hashes(以及许多其他Enumerable方法)编写2个块参数,这可能是你认为你正在迭代的,但是

@plaqy['products']

是一个数组

答案 1 :(得分:0)

为了扩展上面的答案,在你的视图中,你正在迭代一个数组,但把它当作一个哈希。因此,您可能希望将视图更改为:

<强>视图/ plaqueorders / new.html.erb

...
<% @plaqy['products'].each do |product|%>
 Name: <%= product['name'] %>
 Price: $<%= product['price'] %>
<% end %>
...

显然,该块会根据您想要渲染每个产品的方式而改变,但这样的东西会起作用。

如果你想绕过哈希,因为你不知道形状是什么(奇怪但没关系),你需要像

这样的东西
...
<% @plaqy['products'].each do |product|%>
 <% product.each do |key, value| %>
   <%= key %>: <%= value %>
 <% end %>
<% end %>
...

命名每个循环的变量k,v通常保留用于散列。但是在你的代码中,k不是哈希的关键,而是每个单独的产品。