So erstellen Sie eine Liste mit assoziativen Arrays in yaml

80

Ich versuche, einige Konfigurationsvariablen in yaml zu speichern, die als assoziatives Array oder Wörterbuch dargestellt werden. So habe ich es gemacht:

content_prices:                                                                                                                                                                                                                               
  - {country: AU, price: 6990000}                                                                                                                                                                                                             
  - {country: AT, price: 4990000}                                                                                                                                                                                                             
  - {country: BE, price: 4990000}  

Dies führt zu einer Ausnahme, wenn ich versuche, sie aus meinen ROR-Init-Dateien zu analysieren:

undefinierte Methode `symbolize_keys! ' für null: NilClass

So initiiere ich es:

Config = YAML.load_file("#{Rails.root}/config/prices.yml")[Rails.env].symbolize_keys!

Ich denke, meine Yaml-Syntax ist falsch. Wie schreibe ich sie dann richtig?

Antzi
quelle
2
Ich sehe keine Abschnitte für Schienen-Envs in Ihrer YAML
Sergio Tulentsev

Antworten:

161

Ihre YAML sieht in Ordnung aus, oder Sie können eine Reihe von Hashes wie folgt konfigurieren:

content_prices:
  - country: AU
    price: 6990000
  - country: AT
    price: 4990000
  - country: BE
    price: 4990000

Welches wird als der folgende Hash geladen:

{"content_prices"=>[
  {"country"=>"AU", "price"=>6990000}, 
  {"country"=>"AT", "price"=>4990000}, 
  {"country"=>"BE", "price"=>4990000}]}

Aber das gibt Ihnen immer noch keinen Hinweis auf Rails.envden Haupt-Hash. Das Problem scheint eher das zu sein, was Sie in Ihrem Hash erwarten, als das Format der YAML.

Shadwell
quelle
Ich denke, dies ist ein Inline-Ansatz key: - string1, key: ['string1', 'string2',und dies ist eine zeitgemäße - { param1: 'myvalue', param2: 'myvalue2' } Objektnotation für Assoziative, bei der die obige Syntax nicht akzeptiert wird. Stackoverflow.com/a/33136212/3419535 , stackoverflow.com/a/49814618/3419535
FantomX1
12

Nicht auf Schienen, sondern auf Symfony2 PHP musste ich die yml-Datei folgendermaßen konfigurieren:

content_prices:
  - - 
    Land: AU
    Preis: 6990000
  - - 
    Land: AT
    Preis: 4990000
  - - 
    Land: BE
    Preis: 4990000
Sinhix
quelle
6
Dies ist ein Problem mit dem Symfony-Parser, der die Spezifikation von Listen nicht berücksichtigt, es sei denn, es gibt eine neue Zeile nach dem Strich
Dreftymac
@dreftymac ist dieses Problem jetzt behoben? Könnten Sie einen Link zum Fehlerbericht geben?
Marcv
@marcv wenn mein Gedächtnis mir richtig dient, wurde es behoben
dreftymac
0

Nur für den Fall, dass jemand dynamische Schlüssel verwenden möchte, ist es auch möglich:

AppBundle\Service\MailerService:
    lazy: false
    arguments:
      $defaultFrom:
        '%mailer_user%': '%mailer_name%'
GrumpyHat
quelle