2010-09-12 15 views
0

我希望有人會發現爲什麼這不起作用。我的工廠創建順序有問題

我得到一個錯誤,因爲我用Factory_Girl指定的屬性沒有在驗證前應用於存根。

的錯誤:

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 

工廠

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

謝謝!!

+0

至於nitpicks,':class => Vote/Post/Category'是多餘的,因爲factory_girl會從你的工廠名稱推導出類(:vote成爲投票,:post變成post等) – 2010-09-13 13:08:49

+0

啊也這麼覺得!希望他們的文檔說。謝謝! – Trip 2010-09-13 17:58:45

回答

2

您有一個category屬性,它似乎是一個字符串,但您似乎也有一個類別關聯,它會自動創建一個名爲category的Post屬性,可能會覆蓋您的類別屬性。因此,Category類沒有downcase方法,因爲它不是字符串。

將您的類別屬性重命名爲類似category_name的東西,但實際上您根本不應該擁有該屬性。

也許你在打電話self.category.downcase你的意思是self.category.name.downcase

+0

只是試圖圍繞這個包裹我的大腦。我認爲你所說的是,Post downcase方法也被傳遞給它的關聯,因爲它與它的屬性具有相同的名稱?如果我重命名它,那麼它會在不通過Post模型的情況下將其加工。你爲什麼會建議我根本沒有這個屬性? – Trip 2010-09-13 12:16:05

+1

'downcase'是String類的一個實例方法。你試圖在'self.category'上調用它,它是一個Category對象(你的模型),它沒有那個方法,因爲它不是一個String。我不確定我是否理解你的評論的其餘部分。 – 2010-09-13 13:07:10

+0

啊但self.category是一個字符串。由於用戶輸入他們帖子的類別,我需要使用字符串值來將他們的帖子與類別關聯起來。所以Post有一個屬性類別。如果該字符串與Category.name匹配,則它們在搜索結果中匹配。但即使self.category是Post的字符串,它**看起來好像將其稱爲Category類型。我假設這是因爲關聯名稱與屬性名稱相同? – Trip 2010-09-13 17:57:54