Katakanlah saya memiliki hash berikut:
{ :foo => 'bar', :baz => 'qux' }
Bagaimana saya bisa secara dinamis mengatur kunci dan nilai untuk menjadi variabel instan dalam suatu objek ...
class Example
def initialize( hash )
... magic happens here...
end
end
... sehingga saya berakhir dengan yang berikut di dalam model ...
@foo = 'bar'
@baz = 'qux'
?
hash.each {|k,v| instance_variable_set("@#{k}",v)}
hash.each &method(:instance_variable_set)
, metodeinstance_variable_set
menerima dua parameter yang dibutuhkan?sumber
.new()
dilakukan rantai kedua ?Struct.new
membuat kelas baru berdasarkan kunci hash, lalu yang keduanew
membuat objek pertama dari kelas yang baru saja dibuat, menginisialisasinya ke nilai-nilai Hash. Lihat 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)
Anda membuat kami ingin menangis :)
Dalam kasus apapun, lihat
Object#instance_variable_get
danObject#instance_variable_set
.Selamat membuat kode.
sumber
set_entity
panggilan balik umum untuk semua pengontrol, dan saya tidak ingin mengganggu variabel instan yang adadef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
Anda juga dapat menggunakan
send
yang mencegah pengguna menyetel variabel contoh yang tidak ada:Gunakan
send
jika di kelas Anda ada penyetel sepertiattr_accessor
untuk variabel instan Anda:sumber