2010-09-21 8 views
5

Sto provando a postare un post associato a un voto. In questo modo Post.votes genererebbe i voti associati ad esso.metodo non definito `each 'in uno scenario factory_girl/rspec2

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

E la mia rspec2 è relativamente semplice:

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

Quindi, perché è restituire questo errore:

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]

Rails 3.0.0

risposta

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

è lo stesso cercando di andare

some_voted_post.votes = Factory(:vote) 

In sostanza si sta tentando di assegnare un solo voto come un array.

EDIT

Si può avere una matrice contenente un solo voto, ma non si può solo avere un unico voto.

E 'la differenza tra:

some_voted_post.votes = Factory(:vote) 

e

some_voted_post.votes = [Factory(:vote)] 

Il primo non è un array, e quindi non funziona, il secondo è un array.

+1

Basta fare "p.association: vote' (non plurale) –

+0

Come mai un singolo voto non funzionerebbe come array? – Trip

+1

@Trip Vedi modifica. –

4

Se si desidera assegnare all'associazione has_many che si aspetta di matrice e non un singolo valore, è necessario utilizzare la forma lunga:

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

E incapsulare la creazione dell'associazione con [] per garantire tale matrice sarebbe restituito