ruby on rails - yml - Rails charge YAML en hachage et référence par symbole




ruby on rails i18n date format (6)

Je charge un fichier YAML dans Rails 3.0.9 comme ceci:

APP_CONFIG = YAML.load(File.read(File.expand_path('../app.yml', __FILE__)))

Il charge tout le contenu comme des hachages hiérarchiques, pas de problème. La partie que je n'aime pas est le fait que les hachages ne sont accessibles qu'avec des guillemets simples ou doubles mais pas un symbole.

APP_CONFIG['mailer']['username']  # works fine
APP_CONFIG[:mailer][:username]    # doesn't

Des pensées?


  1. Rails a une méthode spéciale pour symboliser les clés.
  2. Vous pouvez utiliser la méthode load_file et supprimer File.read
  3. Vous ne savez pas si vous avez également besoin de expand_path, le répertoire par défaut est rails root.

Je l'écrirais aussi simple:

YAML::load_file('app.yml').symbolize_keys


C'est la même chose de la réponse choisie, mais avec une meilleure syntaxe:

YAML.load(File.read(file_path)).with_indifferent_access 

Il y a une autre réponse potentielle que j'ai découverte en creusant.

Vous pouvez renoncer à HashWithIndifferentAccess.new en ajoutant ceci au début de vos fichiers YAML:

--- !map:HashWithIndifferentAccess

alors simplement YAML.load comme d'habitude. Le seul truc est que les rails doivent déjà être chargés si vous le faites dans votre environnement pour une utilisation dans les initialiseurs, etc. (comme je le suis).


Je n'utilise généralement pas HashWithIndifferentAccess juste pour éviter la confusion et éviter les incohérences dans la façon dont on y accède, donc ce que je ferais à la place est de virer sur un .deep_symbolize_keys pour obtenir le tout sous forme de clé de symbole.


Si vous utilisez du Ruby pur (sans Rails), vous pouvez passer au format JSON. La méthode d' parse la parse JSON peut symboliser les clés.

http://ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html#method-i-parse

Voici ce que je veux dire:

JSON.parse(JSON.dump(YAML.load_file(File.expand_path('../app.yml', __FILE__))), symbolize_names: true)

Remarque : Cela ajoute un surcoût de conversion de et vers JSON.


Une solution alternative consiste à avoir les clés auxquelles vous souhaitez accéder en tant que symbole précédé d'un deux-points. Par exemple:

default: &default
  :symbol: "Accessed via a symbol only"
  string: "Accessed via a string only"

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

Plus tard, vous pouvez ensuite accéder à ceux-ci comme suit:

APP_CONFIG[:symbol]
APP_CONFIG['string']

Notez que j'utilise YAML::ENGINE.yamler = "syck" . Je ne sais pas si cela fonctionne avec psych . (Psych ne supportera certainement pas la fusion de clés comme je l'ai montré dans l'exemple.)

A propos de l'utilisation de HashWithIndifferentAccess : son utilisation a pour effet secondaire de créer des clés en double: une pour l'accès aux symboles et une pour l'accès aux chaînes. Cela peut être néfaste si vous transmettez des données YAML sous forme de tableaux. Soyez conscient de cela si vous allez avec cette solution.





symbol