Ruby on rails 在我创建工厂的过程中出现了一些错误

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

我希望有人能发现为什么这行不通

我收到一个调用的错误,因为我用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 => 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