Angenommen, ich habe den folgenden Hash:
{ :foo => 'bar', :baz => 'qux' }
Wie könnte ich die Schlüssel und Werte dynamisch so einstellen, dass sie zu Instanzvariablen in einem Objekt werden ...
class Example
def initialize( hash )
... magic happens here...
end
end
... so dass ich im Modell folgendes habe ...
@foo = 'bar'
@baz = 'qux'
?
hash.each {|k,v| instance_variable_set("@#{k}",v)}
hash.each &method(:instance_variable_set)
die Methodeinstance_variable_set
die beiden benötigten Parameter empfängt?quelle
.new()
?Struct.new
eine neue Klasse basierend auf den Hash-Schlüsseln. Die zweite Klasse erstellt dann dasnew
erste Objekt der gerade erstellten Klasse und initialisiert es mit den Werten des Hash. Siehe 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)
Du bringst uns dazu zu weinen :)
In jedem Fall siehe
Object#instance_variable_get
undObject#instance_variable_set
.Viel Spaß beim Codieren.
quelle
set_entity
Rückruf für alle Controller haben und vorhandene Instanzvariablen nicht störendef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
Sie können auch Folgendes verwenden
send
, um zu verhindern, dass der Benutzer nicht vorhandene Instanzvariablen festlegt:Verwenden
send
Sie diese Option, wenn in Ihrer Klasse ein Setter wieattr_accessor
für Ihre Instanzvariablen vorhanden ist:quelle