1

我似乎无法解决这个问题。

我想在没有数据库的情况下完成此操作:

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
4

2 回答 2

5

我将假设您并没有真正使用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">

请注意,在现实生活中,您可能希望检查在构造函数中传递的属性列表,以确保它们是您的类的有效属性。

于 2011-01-28T22:10:25.503 回答
0

你可以重写初始化方法来改变 Object.new 的行为:

class Object
  def initialize( arguments )
    # Do something with arguments here
  end
end
于 2011-01-28T22:16:01.080 回答