2010-09-12 7 views
0

j'espérais que quelqu'un repérer pourquoi cela ne fonctionnerait pas.Quelque chose de mal dans ma séquence de création d'usine

Je reçois une erreur thats étant appelé parce que les attributs que je spécifions avec Factory_Girl ne sont pas appliquées au talon avant validation.

L'erreur:

undefined method `downcase' for #<Category:0x1056f2f60> 

RSpec2

it "should vote up" do 
    @mock_vote = Factory.create(:vote) 
    Vote.stub(:get_vote).and_return(@mock_vote) 
    get :vote_up, :id => "1"   
end 

usines

Factory.define :vote, :class => Vote do |v| 
    v.user_id "1" 
    v.association :post 
end 

Factory.define :post, :class => Post do |p| 
    p.category "spirituality" 
    p.name "sleezy snail potluck" 
    p.association :category 
end 

Factory.define :category, :class => Category do |c| 
    c.name "spirituality" 
    c.id "37" 
end 

post.rb - Modèle

before_save   :prepare_posts 
validate    :category? 

def prepare_posts 
    self.update_attribute("category", self.category.downcase) 
    if self.url? 
    self.url = "http://" + self.url unless self.url.match /^(https?|ftp):\/\// 
    end 
end 

def category? 
    unless Category.exists?(:name => self.category.downcase) 
    errors.add(:category, "There's no categories with that name.") 
    end 
    return true 
end 

Aussi, ne hésitez pas à pinailler tout code à la recherche de manière flagrante brut. : D

Merci !!

+0

En ce qui concerne nitpicks, les choses ': class => Vote/Post/Category' sont redondantes, car factory_girl déduira la classe de votre nom d'usine (: vote devient Vote,: poste devient Post, etc.) –

+0

Ah Je le pensais! J'aimerais que leur documentation dise cela. Merci! – Trip

Répondre

2

Vous avez un attribut category, qui semble être une chaîne, mais vous semblez également avoir une association de catégorie qui crée automatiquement, entre autres choses, un attribut sur Post appelé category, écrasant probablement votre attribut category. Par conséquent, la classe Category n'a pas de méthode downcase, car ce n'est pas une chaîne.

Renommer votre attribut de catégorie à quelque chose comme category_name, mais vraiment vous ne devriez pas avoir cet attribut du tout.

Peut-être où vous appelez self.category.downcase que vous vouliez dire self.category.name.downcase?

+0

J'essaie juste d'envelopper mon cerveau autour de ça. Je pense que ce que vous dites, c'est que la méthode Down-Post est également transmise à son association parce qu'elle porte le même nom que son attribut? Et si je le renommer alors il l'usine sans passer par le modèle Post. Pourquoi suggérez-vous que je n'ai pas cet attribut du tout? – Trip

+1

'downcase' est une méthode d'instance de la classe String. Vous essayez de l'appeler sur 'self.category' qui est un objet Category (votre modèle), qui n'a pas cette méthode parce que ce n'est pas une chaîne. Je ne suis pas sûr de comprendre le reste de votre commentaire. –

+0

Ah mais self.category est une chaîne. Étant donné que les utilisateurs saisissent les catégories de leurs publications, j'ai dû utiliser une valeur de chaîne pour associer leurs publications aux catégories. So Post a une catégorie d'attributs. Et si cette chaîne correspond à un Category.name, alors ils correspondent dans les résultats de recherche. Mais même si self.category est une chaîne de caractères pour Post, cela semble ** s'apparenter à l'appeler le modèle Category. Ce que je suppose est parce que le nom de l'association est le même nom que l'attribut? – Trip

Questions connexes