2011-12-30 3 views
2

は、FactoryGirlで、それはあなたが私がhttps://github.com/thoughtbot/factory_girlでソースコードを見てきたが、彼らはこれを達成する方法を見つけ出すように見えることはできません方法とオブジェクトをブロックに直接渡すには?それはだように例えば

factory :user, :class => User do 
    sequence :username do |n| 
    "blahblah#{n}" 
    end 
end 

ような何かを行うことができます(それはloksプロキシのいくつかのタイプ?)。つまり、sequenceメソッドにはどのようにアクセスできますか?

答えて

4

instance_evalを使用しています。

これはブロックself内部(及び従って物体sequenceが上で呼び出された)ことを意味し、それはそうでなければ(この場合はおそらくトップレベルのオブジェクト)であるものではなくinstance_evalこの中(コールされたことオブジェクトケース工場の女の子の構文の構文を実装するオブジェクト。

それなしであなたが

ような何かをする必要があると思いますので、それは多くの場合のDSL(別の例では、レール> = 3でroutes.rbをファイルです)で使われています
factory ... do |f| 
    f.sequence ... 
end 

DSLから逸脱する傾向がある。

一つの小さな例では、これは、トップレベルのオブジェクトがlength方法がないため、エラーが発生したであろうが、instance_evalが使用されているので、長さは文字列で呼び出された「通常の」ブロックとの効果

foo = "123456" 
foo.instance_eval do 
    length 
end 
#=> 6 

を示します代わりに。

関連する問題