Можно ли создать объект с использованием object.new (: attribute => «foobar») с attr_accessors?

StackOverflow https://stackoverflow.com/questions/4833471

  •  27-10-2019
  •  | 
  •  

Вопрос

Кажется, я не могу решить это.

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

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
Это было полезно?

Решение

Я собираюсь предположить, что вы на самом деле не используете 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">

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

Другие советы

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

class Object
  def initialize( arguments )
    # Do something with arguments here
  end
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top