Псевдоним атрибута ruby ActiveResource::Base
class ChatMessage < ActiveResource::Base
alias_attribute :user_id, :userId
alias_attribute :chat_id, :chatId
alias_attribute :message_text, :MessageText
...
У меня проблема в том, что то, что я возвращаю из API, имеет имена атрибутов, которые мне не нравятся, например, см. CamelCaps. Я не хочу делать это с каждой моделью в моем приложении. Есть ли какой-то метод, пропущенный магией, который я мог бы применить?
Ура Томас
1 ответ
Решение
Вы можете сделать немного метапрограммирования здесь:
module JavaAliasing
def initialize(hash)
super(Hash[hash.map do |k,v|
[k.to_s.gsub(/[a-z][A-Z]/) { |s| s.split('').join('_') }.downcase.to_sym, v]
end])
end
end
Позвольте мне проиллюстрировать это:
class Instantiator
def initialize(hash)
hash.each { |k,v| instance_variable_set "@#{k}", v }
end
end
Instantiator.new(asdf: 2).instance_variable_get('@asdf') #=> 2
class MyARModel < Instantiator
include JavaAliasing
end
MyARModel.new(asdfQWER: 2).instance_variable_get("@asdf_qwer") #=> 2
Вот пример из реальной жизни (rails 4.0):
> Player.send :include, JavaAliasing
> Player.new(name: 'pololo', username: 'asdf', 'teamId' => 23)
=> #<Player id: nil, name: "pololo", username: "asdf", email: nil, type: "Player", created_at: nil, updated_at: nil, provider: nil, uid: nil, team_id: 23, last_login: nil, last_activity: nil>