Можно ли создать объект, используя Object.new (: attribute => "foobar") с attr_accessors? - PullRequest
1 голос
/ 29 января 2011

Я не могу решить эту проблему.

Я хочу выполнить это без базы данных:

Object.new(:attribute_1 => "foobar", :attribute_2 => "foobar")

, которые возвращают это:

ArgumentError: wrong number of arguments (1 for 0)
    from (irb):5:in `initialize'
    from (irb):5:in `new'
    from (irb):5

моя модель:

class Object
  extend ActiveModel::Naming
  include ActiveModel::Conversion

  def persisted?
    false
  end

  attr_accessor :attribute_1, :attribute_2

Ответы [ 2 ]

5 голосов
/ 29 января 2011

Я предполагаю, что вы на самом деле не используете Object в качестве имени класса. Если это так, вам просто нужно добавить логику, чтобы установить свои атрибуты в конструкторе:

class Foo
  attr_accessor :bar, :baz

  def initialize(attrs = {})
    attrs.each { |attr,val| instance_variable_set "@#{attr}", val }
  end
end

p Foo.new
p Foo.new(:bar => "abc", :baz => 123)

выходы:

#<Foo:0x2ac3d3a890a0>
#<Foo:0x2ac3d3a88e20 @baz=123, @bar="abc">

Обратите внимание, что в реальной жизни вы хотели бы проверить список атрибутов, переданных в конструкторе, чтобы убедиться, что они являются допустимыми атрибутами для вашего класса.

0 голосов
/ 29 января 2011

Вы можете переопределить метод инициализации, чтобы изменить поведение Object.new:

class Object
  def initialize( arguments )
    # Do something with arguments here
  end
end
...