2011-01-28 4 views
1

私はこれを解決できないようです。attr_accessorsでObject.new(:attribute => "foobar")を使用してオブジェクトを作成することはできますか?

は、私は、データベースなしでこれを実現したい:これを返す

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 
+0

私はあなたが実際にあなたのクラスの名前として 'Object'を使用していないこと、しかし願っています。これにより、すべてがObjectから派生しているため、Rubyのすべてのオブジェクトの機能が変更されます。これを行うことで '1.attribute_1'や' 'my string" .attribute_1'のような奇妙なことをすることができます。 – dontangg

答えて

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"> 

注実際の生活の中であなたがのリストをチェックしたいと思うことコンストラクタで渡された属性がクラスの有効な属性であることを確認します。

+0

すごい!ありがとう!それはまさに私が探していたものでした – Trip

0

あなたはObject.newの動作を変更するためにinitializeメソッドをオーバーライドすることができます。

class Object 
    def initialize(arguments) 
    # Do something with arguments here 
    end 
end 
関連する問題