Ao lidar com objetos hashificados que são enviados para uma API externa, os nomes das variáveis ​​de instância originais podem não estar em conformidade com essa API. Renomear todas as chaves Hash resolveria, felizmente o Ruby nos abençoa com métodos incrÃveis, como each with object, que itera o bloco fornecido para cada elemento com um objeto arbitrário fornecido e retorna o objeto inicialmente fornecido.
Mostre-me algum código!
Considere a seguinte classe:
class Dog
attr_accessor :name, :breed, :owner_name, :birth_place
def initialize(opts = {})
@name ||= opts[:name]
@breed ||= opts[:breed]
@owner_name ||= opts[:owner_name]
@birth_place ||= opts[:birth_place]
end
def attributes
Hash[instance_variables.map { |name, _| [name.to_s.sub!(%r{@}, '').to_sym, instance_variable_get(name)] }]
end
end
Isso nos dá um objeto hashificado parecido com este:
> dog = Dog.new({name: 'John', breed: 'labrador', owner_name: 'Peter', birth_place: 'Canada'})
=>#<Dog:0x00000003381578 @name="John", @breed="labrador", @owner_name="Peter", @birth_place="Canada">
> hsh = dog.attributes
=> {:name=>"John", :breed=>"labrador", :owner_name=>"Peter", :birth_place=>"Canada"}
Nossa API não permite chaves snake-case ou camel-case, portanto, precisamos nos livrar delas
def remove_snake_case(word)
conversion = word.to_s.gsub(/_/, '')
return conversion.to_sym if word.is_a?(Symbol)
conversion
end
each_with_object
para o resgate!
> hsh.each_with_object({}) {|(key, value), obj| obj[remove_snake_case(key)] = value}
=> {:name=>"John", :breed=>"labrador", :ownername=>"Peter", :birthplace=>"Canada"}
Ruby não é ótimo?