【问题标题】:Iterate over JSON Array in Rails5在 Rails5 中迭代 JSON 数组
【发布时间】:2018-03-23 10:29:07
【问题描述】:

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

config/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
...

views/plaqueorders/new.html.erb

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

【问题讨论】:

  • 你试过查看JSON.load(File.read('config/plaque_data.json'))的输出吗? (例如在您的 irb 控制台中)
  • @MrYoshiji 这是控制台中打印的内容=&gt; {"products"=&gt;[{"name"=&gt;"Large Plaque", "price"=&gt;"2500"}, {"name"=&gt;"Small Plaque", "price"=&gt;"1500"}]}
  • 您确实应该指定该文件的完整路径,例如Rails.root.join('config/plaque_data.json')
  • 另外,如果plaque_data.json 文件不打算更改,您可能希望在服务器启动时加载它并缓存它,而不是每次执行此操作时都读取它

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


【解决方案1】:

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

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

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

@plaqy['products']

是一个数组

【讨论】:

    【解决方案2】:

    只是为了扩展上述答案,在您看来,您正在迭代一个数组,但将其视为哈希。因此,您可能希望将视图更改为:

    views/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 不是散列的键,而是每个单独的产品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2014-05-04
      • 2014-09-24
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多