2012-03-09 9 views
0

私はしばらくこの頭を叩いていました。誰かが私を再建してください。アトリビュートセッターとのファクトリーガールの多形関連エラー

シナリオ

は、私は、次のモデルは

class House < ActiveRecord::Base 
    has_one :tenancy, :dependent => :destroy, :as => :tenant 
end 

class LeaseAgreement < ActiveRecord::Base 
    has_many :tenancies 
end 

class Tenancy < ActiveRecord::Base 
    belongs_to :tenant, :polymorphic => true 
    belongs_to :lease_agreement 

    def lease=(lease) 
    if lease.rent_amount > 10000 
     # do something here 
    else 
     # do something else here 
    end 

    self.lease_agreement = lease 
    end 
end 

マイ工場

Factory.define :lease_agreement do |l| 
    l.name "Foo" 
    l.rent_amount 5000 
end 

Factory.define :tenancy do |t| 
    t.name "Foo" 
    t.association :tenant, :factory => :house 
    t.after_build { |tenancy| tenancy.lease = Factory.create(:lease_agreement) } 
end 

もこの

Factory.define :tenancy do |t| 
    t.name "Foo" 
    t.association :tenant, :factory => :house 
    t.after_build { |tenancy| tenancy.lease = Factory.create(:lease_agreement, :tenant => tenancy) } 
end 
を試してみましたこれを試してみると、私の仕様テストの両方の方法があります。 @house = Factory(:house)次のエラーが発生します

NoMethodError: undefined method `rent_amount' for nil:NilClass 
from /home/kibet/.rvm/gems/ruby-1.8.7-p352/gems/activesupport-3.0.5/lib/active_support/whiny_nil.rb:48:in `method_missing' 
from /home/kibet/code/ruby/stuff/app/models/tenancy.rb:44:in `lease=' 

どうすればよいですか?

+0

あなたの家の工場はどこですか? – Nitrodist

答えて

1

動作の問題のように見えますが、リースが正当なLeaseAgreementインスタンスであるafter_buildフックを評価する前に、リースがnilに設定されていると思います。

あなたのコードは、渡されているリースを処理できません。これは、関連付けをクリアする場合には正当な値です。そのようnilを扱うお試しください:

class Tenancy < ActiveRecord::Base 
    belongs_to :tenant, :polymorphic => true 
    belongs_to :lease_agreement 

    def lease=(lease) 
    if lease.present? && lease.rent_amount > 10000 
     # do something here 
    else 
     # do something else here 
    end 

    self.lease_agreement = lease 
    end 
end 

常にで渡さnilをリースでエラーが発生します書かれたように、コード

+0

時間を取ってくれてありがとう@ウィンフィールド。あなたの提案はそれを働かせて、私はあなたが提案したものに頼りにしましたが、なぜ私の工場がうまくいかないのか不思議です。 –

0

あなたはこのようなあなたの工場を書く場合、私は思う:。

Factory.define :tenancy do |t| 
    t.name "Foo" 
    t.association :tenant, :factory => :house 
    t.after_build { |tenancy| tenancy.lease = Factory.create(:lease_agreement) } 
end 

:lease_agreementが正しく作成され、正常に動作するはずです。 lease_agreementにはtenancyはありません。

+0

それはうまくいきませんでしたが、私はすでにこれを試していましたが(この場合は論理的に見えますが)面白いほどうまくいきませんでした。同じエラーが発生しました。 –

関連する問題