Я в той же проблеме, я думал в решении @ htanata , также возможно реализовать это monkey patch :
class HashWithIndifferentAccess < Hash
def to_yaml_typea
""
end
end
Но это также очень опасно.
Я думал о реализации моего собственного YAML :: Emitter , но это выглядело как перерасход технологии.
Это также сработало:
JSON.parse(my_hash_with_indifferent_access.to_json).to_yaml
Но не выглядел слишком эффектно:)
Также приходило мне в голову:
my_hash_with_indifferent_access.to_yaml.gsub( " !map:ActiveSupport::HashWithIndifferentAccess", "" )
Все еще думать возможно, но все мы согласны с тем, что это плохо пахнет.
Мое окончательное решение было :
# config/intializers/hash_with_indifferent_access_extension.rb
# use it like `params.to_hash_recursive.to_yaml`
class HashWithIndifferentAccess < Hash
def to_hash_recursive
result = self.to_hash
result.each do |key, value|
if(value.is_a? HashWithIndifferentAccess)
result[key] = value.to_hash_recursive
end
end
result
end
end
Это также обезьяна-патч , но по крайней мере это обезьяна-патч несуществующего метода , поэтому возможности вмешательства в поведение кода сторонней организации очень странные.
PD : любые предложения по очистке этого кода см. В gist