2010-09-21 20 views
5

Estoy tratando de crear una publicación asociada a un voto. Para que Post.votes genere los votos que están asociados con él.método undefined `each 'en un escenario factory_girl/rspec2

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

Y mi rspec2 es relativamente sencillo:

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

Así que ¿por qué sería volver este error:

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

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

Rails 3.0.0

Respuesta

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

es lo mismo que tratar de ir

some_voted_post.votes = Factory(:vote) 

Básicamente que está intentando asignar un solo voto como una matriz.

EDITAR

Usted puede tener una matriz que contiene un solo voto, pero no se puede simplemente tener un solo voto.

Es la diferencia entre:

some_voted_post.votes = Factory(:vote) 

y

some_voted_post.votes = [Factory(:vote)] 

el primero es no una matriz, y por lo tanto no funciona, el último es una matriz.

+1

Simplemente haga 'p.association: vote' (non-plural) –

+0

¿Cómo es que un solo voto no funcionaría como una matriz? – Trip

+1

@Trip Ver edición. –

4

Si desea asignar asociación has_many la que espera matriz y no un solo valor, se debe utilizar la forma larga:

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

y encapsular la creación de la asociación con [] para asegurar esa matriz sería devuelto

Cuestiones relacionadas