Digamos que eu tenha o seguinte hash:
{ :foo => 'bar', :baz => 'qux' }
Como eu poderia definir dinamicamente as chaves e valores para se tornarem variáveis de instância em um objeto ...
class Example
def initialize( hash )
... magic happens here...
end
end
... para que eu acabe com o seguinte dentro do modelo ...
@foo = 'bar'
@baz = 'qux'
?
hash.each {|k,v| instance_variable_set("@#{k}",v)}
hash.each &method(:instance_variable_set)
o métodoinstance_variable_set
recebe os dois parâmetros de que precisa?fonte
.new()
fazendo?Struct.new
cria uma nova classe baseada nas chaves hash, e então a segundanew
faz o primeiro objeto da classe recém-criada, inicializando-o com os valores do Hash. Consulte ruby-doc.org/core-1.8.7/classes/Struct.htmlrequire 'ostruct'; h = {:foo => 'foo'}; o = OpenStruct.new(h); o.foo == 'foo'
Struct.new(*hash.keys.map { |str| str.to_sym }).new(*hash.values)
Você dá vontade de chorar :)
Em qualquer caso, veja
Object#instance_variable_get
eObject#instance_variable_set
.Boa codificação.
fonte
set_entity
retorno de chamada genérico para todos os controladores e não quero interferir nas variáveis de instância existentesdef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
Você também pode usar o
send
que evita que o usuário defina variáveis de instância inexistentes:Use
send
quando em sua classe houver um setter comoattr_accessor
para suas variáveis de instância:fonte