2010-09-21 3 views
5

Ich versuche, eine Post mit einer Abstimmung verbunden. Damit würde Post.votes die damit verbundenen Abstimmungen generieren.undefined Methode `Each 'in einem Factory_girl/RSpec2 Szenario

Factory.define :voted_post, :parent => :post, :class => Post do |p| 
    p.association :votes, :factory => :vote 
end 

Und mein rspec2 ist relativ einfach:

describe "vote scores" do 
    it "should show me the total vote score" do 
    @post = Factory(:voted_post) 
    @post.vote_score.should == 1 
    end 
end 

Also warum sollte es diesen Fehler zurück:

Failures: 
    1) Post vote scores should show me the total vote score 
    Failure/Error: @post = Factory(:voted_post) 
    undefined method `each' for #<Vote:0x105819948> 

Rubin 1.8.7 (2009-06-12 Patchlevel 174) [ universal-darwin10.0]

Schienen 3.0.0

Antwort

8
Factory.define :voted_post, :parent => :post, :class => Post do |p| 
    p.association :votes, :factory => :vote 
end 

Ist das gleiche wie der Versuch, gehen

some_voted_post.votes = Factory(:vote) 

Grundsätzlich sind versuchen Sie eine Stimme als Array zuweisen.

EDIT

Sie können eine einzelne Stimme enthält ein Array haben, aber Sie können nicht nur eine einzige Stimme.

Es ist der Unterschied zwischen:

some_voted_post.votes = Factory(:vote) 

und

some_voted_post.votes = [Factory(:vote)] 

Ersteres ist kein Array, und deshalb nicht funktioniert, letzteres ein Array ist.

+1

Just '' p.association: vote' (nicht-Plural) –

+0

Wie kommt es, dass eine einzige Stimme würde nicht als Array arbeiten? – Trip

+1

@Trip Siehe Bearbeiten. –

4

Wenn Sie has_many Verein zuweisen möchten, die Array und nicht einen einzelnen Wert erwartet, sollten Sie das lange Formular:

Factory.define :voted_post, :parent => :post, :class => Post do |p| 
    p.votes { |vote| [vote.association(:vote)] } 
end 

und kapseln die Schaffung des Vereins mit [] das Array, um sicherzustellen, wäre zurückgegeben