Quelque chose de mal dans ma séquence de création d'usine
-
02-10-2019 - |
Question
J'espérais que quelqu'un repérer pourquoi cela ne marcherait pas.
Je reçois une erreur thats étant appelée parce que les attributs que je précise avec Factory_Girl ne sont pas appliquées au talon avant la validation.
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
En outre, ne hésitez pas à pinailler tout code à la recherche de manière flagrante brut. : D
Merci !!
La solution
Vous avez un attribut category
, qui semble être une chaîne, mais vous semblez aussi avoir une association de catégorie qui crée automatiquement, entre autres, un attribut sur Post a appelé category
, probablement votre attribut remplaçant la catégorie. Par conséquent, la classe Category
n'a pas de méthode de downcase
, parce que 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
vous vouliez dire self.category.name.downcase
?