Занятная штука в Ruby on Rails 3, которую долго раскапывал по неопытности. Когда мы в контроллере получаем params, это не хэш, а HashWithIndifferentAccess, т.е. и params[:something], и params['something'] — это одно и то же.
А вот если мы объявляем некий хэш — скажем, такой:
my_hash = { :key1 => 'val1', :key2 => 'val2' }
то обратиться к нему любым из способов уже не получится.
Чтобы создать экземпляр HashWithIndifferentAccess, можно сделать так:
my_hash = {}.with_indifferent_access
Пишут об этом классе вполне откровенно на rubyonrails.org: «This class has dubious semantics».
На ту же тему: ruby on rails: merge! ‘params’ with a hash indifferently.