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 に答える