2015-04-22 3 views
6

Wie kann ich Elemente in meinem yml auflisten und durch sie in der Ansicht durchlaufen und auf ihre Eigenschaften zugreifen? Mein aktueller Code ruft nur das letzte Element in der Liste ab. Ich möchte in der Ansicht die Liste der Elemente durchlaufen und ihre title und description Elemente anzeigen.Schienen i18n Liste von Elementen und Schleifen in Sicht

z.B.

yml:

en: 
    hello: "Hello world" 
    front_page: 
    index: 
     description_section: 
     title: "MyTitle" 
     items: 
      item: 
      title: "first item" 
      description: "a random description" 
      item: 
      title: "second item" 
      description: "another item description" 

Ansicht:

 <%= t('front_page.index.description_section.items')do |item| %> 
      <%= item.title %> 
      <%= item.description %> 
     <%end %> 

Ergebnis:

{:item=>{:title=>"second item", :description=>"another item description"}} 

Gewünschtes Ergebnis:

first item 
    a random description 

    second item 
    another item description 

Antwort

8

Verwenden Sie stattdessen:

<% t('front_page.index.description_section.items').each do |item| %> 
#^no equal sign here 
    <%= item[:title] %> 
    #^^^^ this is a hash 
    <%= item[:description] %> 
<% end %> 

auch Liste Ihre Artikel definiert ist nicht richtig:

t('front_page.index.description_section.items.item.title') 
# => returns "second item" because the key `item` has been overwritten 

Verwenden Sie die folgende Syntax ein Array in YAML zu definieren:

items: 
- title: "first item" 
    description: "a random description" 
- title: "second item" 
    description: "another item description" 

Um dies zu überprüfen Sie können dies in Ihrer IRB-Konsole tun:

h = {:items=>[{:title=>"first item", :description=>"desc1"}, {:title=>"second item", :description=>"desc2"}]} 
puts h.to_yaml 
# => returns 
--- 
:items: 
- :title: first item 
    :description: desc1 
- :title: second item 
    :description: desc2 
+0

Ja! Das hat es getan. Ran toll. Ich musste ein ".each" hinzufügen, damit es richtig loopte. – DogEatDog