Disons que j'ai le hachage suivant:
{ :foo => 'bar', :baz => 'qux' }
Comment pourrais-je définir dynamiquement les clés et les valeurs pour devenir des variables d'instance dans un objet ...
class Example
def initialize( hash )
... magic happens here...
end
end
... pour que je me retrouve avec ce qui suit à l'intérieur du modèle ...
@foo = 'bar'
@baz = 'qux'
?
hash.each {|k,v| instance_variable_set("@#{k}",v)}
hash.each &method(:instance_variable_set)
, la méthodeinstance_variable_set
reçoit les deux paramètres dont elle a besoin?la source
.new()
?Struct.new
crée une nouvelle classe basée sur les clés de hachage, puis la secondenew
crée le premier objet de la classe qui vient d'être créée, en l'initialisant aux valeurs du Hash. Voir 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)
Tu nous donne envie de pleurer :)
Dans tous les cas, voir
Object#instance_variable_get
etObject#instance_variable_set
.Bon codage.
la source
set_entity
rappel générique pour tous les contrôleurs, et je ne veux pas interférer avec les variables d'instance existantesdef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
Vous pouvez également utiliser
send
ce qui empêche l'utilisateur de définir des variables d'instance inexistantes:À utiliser
send
lorsque dans votre classe il y a un setter commeattr_accessor
pour vos variables d'instance:la source