2017-10-11 98 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不是散列的關鍵,而是每個單獨的產品。