If I have a hash in Ruby on Rails, is there a way to make it indifferent access?

You can just use with_indifferent_access.

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

If you have a hash already, you can do:

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

You can also write the YAML file that way:

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

after that:

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

Use HashWithIndifferentAccess instead of normal Hash.

For completeness, write:

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