Ruby on rails 在我创建工厂的过程中出现了一些错误
我希望有人能发现为什么这行不通 我收到一个调用的错误,因为我用Factory_Girl指定的属性在验证之前没有应用到存根 错误:Ruby on rails 在我创建工厂的过程中出现了一些错误,ruby-on-rails,ruby-on-rails-3,rspec,factory-bot,rspec2,Ruby On Rails,Ruby On Rails 3,Rspec,Factory Bot,Rspec2,我希望有人能发现为什么这行不通 我收到一个调用的错误,因为我用Factory_Girl指定的属性在验证之前没有应用到存根 错误: undefined method `downcase' for #<Category:0x1056f2f60> 工厂 Factory.define :vote, :class => Vote do |v| v.user_id "1" v.association :post end Factory.define :post, :class
undefined method `downcase' for #<Category:0x1056f2f60>
工厂
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-型号
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
此外,请随意挑剔任何明显粗俗的代码:D
谢谢 您有一个
category
属性,它看起来是一个字符串,但您似乎也有一个category关联,它在Post上自动创建一个名为category
的属性,可能会覆盖您的category属性。因此,Category
类没有downcase
方法,因为它不是字符串
将您的category属性重命名为类似于category\u name
,但实际上您根本不应该拥有该属性
也许你打电话的地方是self.category.downcase,你的意思是self.category.name.downcase?只是想让我的大脑思考一下这个问题。我想你说的是,Post downcase方法也被传递给它的关联,因为它和它的属性同名?如果我重命名它,那么它将在不通过Post模型的情况下对其进行工厂化。你为什么建议我根本没有那个属性?
downcase
是String类的一个实例方法。您试图在self.category
上调用它,它是一个category对象(您的模型),没有该方法,因为它不是字符串。我不确定我是否理解你其余的评论。啊,但是self.category是一个字符串。因为用户输入他们文章的类别,所以我需要使用字符串值将他们的文章与类别关联起来。所以Post有一个属性类别。如果该字符串与Category.name匹配,则它们在搜索结果中匹配。但是,即使self.category是Post的字符串,它也似乎将其称为category模型。我假设是因为关联名与属性名相同?如果是这样,那么是的,我的原始答案成立。您有一个类别属性和一个类别关联。该关联正在采取先例并覆盖您的属性。将属性重命名为category_name.Hmm,将p.association更改为p.association:category,:factory=>:valid_category似乎不会更改错误。即使我从后期工厂中删除了p.category,并且在category模型中验证了。也许我不明白关联:D一个标签Post.category“Any String”如何通过工厂创建一个类别。就挑剔而言,:class=>Vote/Post/category
内容是多余的,因为工厂女孩会从你的工厂名称推断出类别(:Vote变成Vote,:Post变成Post,等等)啊,我想是这样的!希望他们的文件能这么说。谢谢
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