2015-07-27 1 views
1

J'ai un graphe d'objet ressemblant à l'arbre qui ressemble à ce qui suit:Comment rendre une valeur de hachage partielle dans JBuilder?

{ 
    :name => "Grandparent", 
    :children => { 
    :child_a => { 
     :name => "Parent A", 
     :children => { 
     :grandchild_a_a => { 
      :name => "Child A-A", 
      :children => {} 
     } 
     :grandchild_a_b => { 
      :name => "Child A-B" 
      :children => {} 
     } 
     } 
    } 
    :child_b => { 
     :name => "Parent B", 
     :children => {} 
    } 
    } 
} 

Je veux générer JSON qui reflète cette structure. Je ne connais pas la profondeur de l'imbrication de l'enfant, et les attributs sont les mêmes pour chaque niveau. Les clés du hash des enfants sont significatives et doivent être préservées.

Je veux utiliser une partie JBuilder pour représenter un niveau, puis l'appeler récursive. Voici mon modèle jusqu'ici:

# _level_partial.json.jbuilder 
# passing the above object graph as :level 
json.name level[:name] 
json.children do 
    level[:children].each do |key, child| 
    # How do I map the following to the given key? 
    json.partial! "level_partial", :level => child 
    end 
end 

Je peux générer le JSON pour chaque enfant par l'assez facilement appel partiel, mais qu'il insère directement dans la sortie JSON. Comment mapper les résultats du partiel à une clé de hachage/objet particulière?

Répondre

1

J'ai trouvé une réponse. Bien qu'il semble être largement non documenté, JBuilder.set! peut accepter un bloc au lieu d'une valeur explicite. Ce bloc peut appeler le partiel, qui est ensuite affecté au hachage.

json.name level[:name] 
json.children do 
    level[:children].each do |key, child| 
    json.set key do 
     json.partial! "level_partial", :level => child 
    end 
    end 
end