是否可以使用attr_accessors使用Object.new(:attribute =>"foobar")创建对象?

Tri*_*rip 1 ruby-on-rails attr-accessor

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

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

Object.new(:attribute_1 => "foobar", :attribute_2 => "foobar")
Run Code Online (Sandbox Code Playgroud)

那回报:

ArgumentError: wrong number of arguments (1 for 0)
    from (irb):5:in `initialize'
    from (irb):5:in `new'
    from (irb):5
Run Code Online (Sandbox Code Playgroud)

我的模特:

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

  def persisted?
    false
  end

  attr_accessor :attribute_1, :attribute_2
Run Code Online (Sandbox Code Playgroud)

cam*_*cam 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)
Run Code Online (Sandbox Code Playgroud)

输出:

#<Foo:0x2ac3d3a890a0>
#<Foo:0x2ac3d3a88e20 @baz=123, @bar="abc">
Run Code Online (Sandbox Code Playgroud)

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