2012-03-09 4 views
0

Je me suis cogné la tête pendant un moment. Quelqu'un s'il vous plaît resque moi.Association d'une fille polymorphe avec un correcteur d'attribut Erreur

Scénario

Je les modèles suivants

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 

Mes usines

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 

aussi essayé

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 

Les deux façons dans mes tests de spécification lorsque j'essaie cela; @house = Factory(:house) Je reçois l'erreur suivante

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=' 

Comment procéder?

+0

Où est votre usine? – Nitrodist

Répondre

1

Cela ressemble à un problème d'ordre de fonctionnement, je pense que lease est défini sur zéro avant d'évaluer votre hook after_build où lease est une instance légitime de LeaseAgreement.

Votre code ne peut pas gérer un bail nul étant transmis, ce qui est une valeur légitime si vous souhaitez effacer l'association. Essayez la manipulation nil comme ceci:

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 

Le code tel qu'il est écrit toujours produire une erreur avec un bail nul passé dans

+0

merci d'avoir pris le temps @Winfield. Votre proposition a fonctionné et j'ai eu recours à ce que vous avez suggéré, mais je me demande toujours pourquoi mes usines n'ont pas fonctionné. –

0

Je pense que si vous écrivez votre usine comme ceci:.

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

votre :lease_agreement sera alors créé correctement, et cela devrait fonctionner. Il n'y a pas de tenancy pour un lease_agreement.

+0

Cela n'a pas fonctionné, j'avais déjà essayé cela (ressemble à la chose logique à faire dans ce cas) mais assez drôle cela n'a pas fonctionné. J'ai la même erreur. –

Questions connexes