Допустим, у меня есть следующий хеш:
{ :foo => 'bar', :baz => 'qux' }
Как я мог динамически установить ключи и значения, чтобы они стали переменными экземпляра в объекте ...
class Example
def initialize( hash )
... magic happens here...
end
end
... так что внутри модели я получу следующее ...
@foo = 'bar'
@baz = 'qux'
?
hash.each {|k,v| instance_variable_set("@#{k}",v)}
hash.each &method(:instance_variable_set)
методinstance_variable_set
получает два необходимых параметра?h = { :foo => 'bar', :baz => 'qux' } o = Struct.new(*h.keys).new(*h.values) o.baz => "qux" o.foo => "bar"
источник
.new()
делает вторая цепочка ?Struct.new
создает новый класс на основе ключей хеширования, а затем второйnew
создает первый объект только что созданного класса, инициализируя его значениями хеша. См 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)
Вы заставляете нас плакать :)
В любом случае смотрите
Object#instance_variable_get
иObject#instance_variable_set
.Удачного кодирования.
источник
set_entity
обратный вызов для всех контроллеров, и я не хочу вмешиваться в существующие переменные экземпляраdef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
Вы также можете использовать,
send
который запрещает пользователю устанавливать несуществующие переменные экземпляра:def initialize(hash) hash.each { |key, value| send("#{key}=", value) } end
Используйте,
send
когда в вашем классе есть сеттер, например,attr_accessor
для переменных вашего экземпляра:class Example attr_accessor :foo, :baz def initialize(hash) hash.each { |key, value| send("#{key}=", value) } end end
источник