Digamos que tengo el siguiente hash:
{ :foo => 'bar', :baz => 'qux' }
¿Cómo podría establecer dinámicamente las claves y los valores para que se conviertan en variables de instancia en un objeto ...
class Example
def initialize( hash )
... magic happens here...
end
end
... para que termine con lo siguiente dentro del modelo ...
@foo = 'bar'
@baz = 'qux'
?
hash.each {|k,v| instance_variable_set("@#{k}",v)}
hash.each &method(:instance_variable_set)
, el métodoinstance_variable_set
recibe los dos parámetros que necesita?fuente
.new()
haciendo exactamente el segundo encadenado ?Struct.new
crea una nueva clase basada en las claves hash, y luego la segunda creanew
el primer objeto de la clase recién creada, inicializándolo con los valores del Hash. Ver 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)
Haces que nos den ganas de llorar :)
En cualquier caso, consulte
Object#instance_variable_get
yObject#instance_variable_set
.Codificación feliz.
fuente
set_entity
devolución de llamada genérica para todos los controladores y no quiero interferir con las variables de instancia existentesdef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
También puede usar lo
send
que evita que el usuario establezca variables de instancia inexistentes:Úselo
send
cuando en su clase haya un setter comoattr_accessor
para sus variables de instancia:fuente