2011-05-02 26 views
43

Si ya tengo un hash, puedo hacerlo de modo queSi tengo un hash en Ruby on Rails, ¿hay alguna manera de hacerlo indiferente?

h[:foo] 
h['foo'] 

son los mismos? (Esto se llama acceso indiferente?)

Los detalles: cargué este hash utilizando la siguiente en initializers pero probablemente no debería hacer una diferencia:

SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml") 
+2

'RAILS_ROOT' está en desuso en favor de' Rails.root'. Obtendrá advertencias locas si usa el estilo antiguo. – tadman

Respuesta

76

sólo puede utilizar with_indifferent_access.

SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml").with_indifferent_access 
+0

Parece que ya no funciona en Rails 3.2.8 al menos. He usado este método exacto por un tiempo, y simplemente intenté usarlo en una nueva aplicación 3.2.8 Rails, pero no parece que ActiveSupport :: HashWithIndifferentAccess esté accesible en application.rb a pesar del hecho de que ActiveSupport sí lo está. – slant

+3

@slant Eso es porque ActiveSupport se ha modularizado. Si desea esto al principio del proceso de carga de la aplicación, solo necesita 'active_support/core_ext/hash/indifferent_access' desde el principio. – gtd

+0

@gtd Ah, eso tiene sentido. Gracias por tomarse el tiempo para explicar eso. – slant

3

Uso HashWithIndifferentAccess en lugar de hash normal.

Para completar, escribir:

SETTINGS = HashWithIndifferentAccess.new(YAML.load_file("#{RAILS_ROOT}/config/settings.yml"­)) 
22

Si usted tiene un hash ya, usted puede hacer:

HashWithIndifferentAccess.new({'a' => 12})[:a] 
+0

así que probablemente use 'SETTINGS = HashWithIndifferentAccess.new (YAML.load_file (" # {RAILS_ROOT} /config/settings.yml "))' para empezar? –

+0

Sí, eso creo :) – moritz

17

También puede escribir el archivo YAML de esa manera:

--- !map:HashWithIndifferentAccess 
one: 1 
two: 2 

después de eso:

SETTINGS = YAML.load_file("path/to/yaml_file") 
SETTINGS[:one] # => 1 
SETTINGS['one'] # => 1 
+0

¿Será ignorado por otras bibliotecas que leerían este archivo? Es posible que tenga un archivo de configuración para compartir con un servidor de nodo, por ejemplo, – Frexuz

+0

Probado con [js-yaml] (https://www.npmjs.com/package/js-yaml) y no funciona. Entonces '! Map: HashWithIndifferentAccess' es una etiqueta YAML y si la biblioteca no puede entenderlo, probablemente habrá un error. – Psylone

0
You can just make a new hash of HashWithIndifferentAccess type from your hash. 

hash = { "one" => 1, "two" => 2, "three" => 3 } 
=> {"one"=>1, "two"=>2, "three"=>3} 

hash[:one] 
=> nil 
hash['one'] 
=> 1 


make Hash obj to obj of HashWithIndifferentAccess Class. 

hash = HashWithIndifferentAccess.new(hash) 
hash[:one] 
=> 1 
hash['one'] 
=> 1 
Cuestiones relacionadas