2013-05-25 75 views
0

我有一個ActiveRecord模型的'offer'屬於2個item的實例。項目屬於用戶。Rails before_save不叫

要約模式有以下幾點:

offered_item_id receiving_item_id offering_user_id 通過讀取商品ID,並通過這種關係會receiving_user_id

在創造我想要的Rails保存用戶的模型。

我有這樣的:

class Offer < ActiveRecord::Base 

    attr_accessible :offered_item_id, :receiving_item_id, :state 

    belongs_to :offering_user, class_name: "User" 
    belongs_to :receiving_user, class_name: "User" 
    belongs_to :offered_item, class_name: "Item" 
    belongs_to :receiving_item, class_name: "Item" 

    before_save :populate_user_ids 

    private 
     def populate_user_ids 
      self.receiving_user_id = self.receiving_item.user.id 
      self.offering_user_id = self.offered_item.user.id 
     end 

end 

但是,即使硬編碼在populate_user_ids方法的價值似乎並沒有工作。我不知道before_save甚至被稱爲。

我的測試通過了項目關係,但用戶關係失敗了。

見我的RSpec測試:

describe "relations" do 
     it { should respond_to (:offering_user) } 
     it { should respond_to (:offered_item) } 
     it { should respond_to (:receiving_user) } 
     it { should respond_to (:receiving_item) } 
     its(:offering_user) { should == offering_user } #FAILS 
     its(:offered_item) { should == offered_item } 
     its(:receiving_user) { should == receiving_user } #FAILS 
     its(:receiving_item) { should == receiving_item } 
    end 

道歉,我很新的軌道上。

可能是什麼問題?

謝謝

+0

您需要讓Rails完成處理'belongs_to'和'has_many'等關係中id的工作。你讀過http://guides.rubyonrails.org/association_basics.html嗎? – lurker

+0

我已經爲項目做了這些,但我不想讓用戶在公共界面中訪問(以避免大規模分配),所以我試圖在幕後設置這些 –

+0

我不確定你的意思。 Rails確實在「幕後」做到了,您可以控制用戶在視圖中看到的內容。但是對於你原來的問題,你是否在你的'before_save'中試着'puts'來看它是否被調用?很難分辨出可能發生的情況,而不知道控制器的外觀。 – lurker

回答

0

啊我是一個弗利'numpty。

我所用:

let!(:offer) { offered_item.offers_made_with.build(receiving_item_id: receiving_item.id) } 

而不是:

let!(:offer) { offered_item.offers_made_with.create(receiving_item_id: receiving_item.id) } 

build不保存,不create