70 votes

Les rails chargent YAML vers le hachage et la référence par symbole

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. Ce que je n’aime pas, c’est que les hachages ne sont accessibles qu’avec des guillemets simples ou doubles, mais pas avec un symbole.

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

Des pensées?

82voto

Rob Di Marco Points 18048

Essayez d’utiliser HashWithIndifferentAccess comme

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

37voto

istvanp Points 1657

Une solution alternative est d'avoir les clés qui vous souhaitez accéder à un symbole précédées d'une virgule. 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 alors accéder à ces de la sorte:

APP_CONFIG[:symbol]
APP_CONFIG['string']

Notez que je suis en utilisant YAML::ENGINE.yamler = "syck". Vous ne savez pas si cela fonctionne avec psych. (Psy certainement ne supportent pas la clé de la fusion comme je l'ai montré dans l'exemple.)

Sur l'utilisation de HashWithIndifferentAccess: à l'aide, il a aussi pour effet de créer des doubles de clés: une pour le symbole de l'accès et une chaîne pour l'accès. Cela peut être malfaisant si vous passez autour de YAML données sous forme de tableaux. Être conscient de cela si vous allez avec cette solution.

29voto

zentralmaschine Points 414

Vous voudrez peut-être jeter un oeil à symbolize_keys () , qui fait exactement ce que l'OP a demandé.

17voto

fotanus Points 6322

C'est la même chose pour la réponse sélectionnée, mais avec une meilleure syntaxe:

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

12voto

Michael K Madison Points 733

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

Vous pouvez renoncer à HashWithIndifferentAccess.new en ajoutant ceci en haut de vos fichiers YAML:

 --- !map:HashWithIndifferentAccess
 

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X