2017-10-11 101 views
0

我知道我错过了一些可能非常明显的东西。我想在我的Rails5视图中遍历一个JSON数组。我尝试了几件事情,但似乎无法获得适当的渲染项目。以下代码呈现给我看来{"name"=>"Large Plaque", "price"=>"2500"} {"name"=>"Small Plaque", "price"=>"1500"}在Rails5中迭代JSON数组

配置/ 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 %> 
... 
+0

你有没有试过看JSON.load(File.read('config/plaque_data.json'))''的输出? (例如你的irb控制台) – MrYoshiji

+0

@MrYoshiji这是在控制台打印的内容'=> {“products”=> [{“name”=>“Large Plaque”,“price”=>“2500”},{ “name”=>“Small Plaque”,“price”=>“1500”}]}' –

+1

您确实应该指定该文件的完整路径,例如'Rails.root.join('config/plaque_data.json') '。 – tadman

回答

2

由于'k'是散列,因此您需要访问k ['name']和k ['price']来提取价格和名称。

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

通常你写的哈希值2个参数(和许多其他可枚举方法),这可能是你以为你遍历,但是

@plaqy['products'] 

是一个数组

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