2017-10-11 5 views
0

Je sais qu'il me manque quelque chose de très évident. J'essaie d'itérer sur un tableau JSON dans ma vue Rails5. J'ai essayé plusieurs choses mais je n'arrive pas à obtenir les bons éléments à rendre. Le code ci-dessous rend {"name"=>"Large Plaque", "price"=>"2500"} {"name"=>"Small Plaque", "price"=>"1500"} à mon avis.Itérer sur JSON Array dans Rails5

config/plaque_data.json

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

contrôleurs/plaqueorders_controller.rb

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

vues/plaqueorders/new.html.erb

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

avez-vous essayé de voir la sortie de 'JSON.load (File.read ('config/plaque_data.json'))'? (dans votre console irb par exemple) – MrYoshiji

+0

@MrYoshiji c'est ce qui est imprimé dans la console '=> {" products "=> [{" name "=>" Large Plaque "," price "=>" 2500 "}, { "name" => "Small Plaque", "price" => "1500"}]} ' –

+1

Vous devriez vraiment spécifier le chemin d'accès complet à ce fichier, comme' Rails.root.join ('config/plaque_data.json') '. – tadman

Répondre

2

Puisque 'k' est un hash, vous devez accéder à k ['name'] et k ['price'] pour extraire le prix et le nom.

Lorsque vous utilisez .each sur un tableau, vous ne déclarez normalement qu'un seul argument de bloc (vous en avez deux, k et v).

Vous écrivez normalement 2 arguments de bloc pour hashs (et beaucoup d'autres méthodes Enumerable), ce qui est peut-être ce que vous pensiez que vous itérez, mais

@plaqy['products'] 

est un tableau

0

Juste pour agrandir sur la réponse ci-dessus, à votre avis, vous itérez sur un tableau, mais en le traitant comme un hachage. Donc, vous voudrez peut-être changer votre point de vue à quelque chose comme:

vues/plaqueorders/new.html.erb

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

Il est évident que le bloc change en fonction de la façon dont vous voulez rendre chaque produit, mais quelque chose comme ça va fonctionner.

Si vous voulez faire une boucle sur les hash parce que vous ne savez pas ce que la forme est (étrange mais correct), vous voulez quelque chose comme

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

Nommer les variables d'une boucle chaque k, v est généralement réservé aux hachages. Mais dans votre code, le k n'était pas la clé du hachage mais plutôt chaque produit individuel.