Cómo hacer una lista de matrices asociativas en yaml

81

Estoy tratando de almacenar algunas variables de configuración en yaml representadas como una matriz asociativa, también conocida como diccionario. Así es como lo hice:

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

Esto produce una excepción cuando trato de analizarlo desde mis archivos de inicio ROR:

método indefinido `symbolize_keys! ' para cero: NilClass

Así es como lo inicio:

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

Supongo que mi sintaxis de yaml es incorrecta, entonces, ¿cómo escribirlo correctamente?

Antzi
fuente
2
No veo secciones para rieles envs en su YAML
Sergio Tulentsev

Respuestas:

162

Su YAML se ve bien, o puede configurar una matriz de hashes como este:

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

Que se cargará como el siguiente hash:

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

Pero eso todavía no le da ninguna referencia al Rails.envhash principal. El problema parece ser lo que esperas que esté en tu hash en lugar del formato del YAML.

Shadwell
fuente
Supongo que este es un enfoque en línea key: - string1, key: ['string1', 'string2',y esta es una notación de objetos contemporánea para asociativa donde no se acepta la sintaxis anterior, - { param1: 'myvalue', param2: 'myvalue2' } stackoverflow.com/a/33136212/3419535 , stackoverflow.com/a/49814618/3419535
FantomX1
12

No en rieles, sino en Symfony2 php, tuve que configurar el archivo yml de esta manera:

content_prices:
  - 
    país: AU
    precio: 6990000
  - 
    país: AT
    precio: 4990000
  - 
    país: BE
    precio: 4990000
sinhix
fuente
6
Este es un problema con el analizador de Symfony que no respeta la especificación de las listas a menos que haya una nueva línea después del guión
dreftymac
@dreftymac, ¿se ha solucionado este problema ahora? ¿Podría proporcionar un enlace al informe de errores?
marcv
@marcv si mi memoria no me falla la arreglaron
dreftymac
0

En caso de que alguien quiera usar claves dinámicas, también es posible:

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