2010-09-21 5 views
5

Próbuję Factory Post związany z Głosowaniem. W ten sposób Post.votes wygeneruje głosy, które są z nim powiązane.Nieokreślona metoda "każdy" w scenariuszu factory_girl/rspec2

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

A moja rspec2 jest stosunkowo prosta:

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

Więc dlaczego byłoby zwrócić ten błąd:

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

Ruby 1.8.7 (2009-06-12 patchlevel 174) [ universal-darwin10.0]

Szyny 3.0.0

Odpowiedz

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

jest taka sama jak stara się iść

some_voted_post.votes = Factory(:vote) 

Zasadniczo próbujesz przypisać jeden głos jako tablicę.

EDIT

Można mieć tablicę zawierającą pojedynczy głos, ale nie można po prostu mieć jeden głos.

to różnica pomiędzy:

some_voted_post.votes = Factory(:vote) 

i

some_voted_post.votes = [Factory(:vote)] 

byłego nie jest tablicą, a tym samym nie działa, to ostatnie jest tablicą.

+1

Po prostu wykonaj 'p.łączenie: głosowanie' (nie w liczbie mnogiej) –

+0

Jak to się stało, że jeden głos nie będzie działał jako tablica? – Trip

+1

@Trip Zobacz edycję. –

4

Jeśli chcesz przypisać stowarzyszenie has_many która oczekuje tablicy, a nie pojedynczą wartość, należy użyć długiej postać:

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

I hermetyzacji utworzenie związku z [], aby upewnić się, że tablica będzie zwrócił