2013-10-31 23 views
0

所以我在其中一個模型中創建了一個用於解析文本主體中的主題標籤的方法。這裏是模型:在ruby模型上出錯:「除非保存父項,否則不能調用create」

class Conversation < ActiveRecord::Base 
    has_many :comments 
    has_many :hashtags, as: :hashtaggable, autosave: true 
    belongs_to :user 
    attr_accessible :description, :title, :user_id 
    before_save :create_hashtags 

    private 

    def create_hashtags 
    if self.description_changed? || self.hashtags.empty? 
     ##scan for new hashtags 
     scanned_tags = self.description.scan(/#\w+/) 
     ##delete old hashtag 
     self.hashtags.destroy_all unless self.hashtags.empty? 
     ##save the new hashtag 
     scanned_tags.each do |hashtag| 
     self.hashtags.create name: hashtag 
     end unless scanned_tags.empty? 
    end 
    end 

    validates :description, presence: true, length: { in: 5..400 } 
    validates :title, presence: true, length: {in: 20..250} 
    validates :user, presence: true 
end 

這工作得很好,如果我更新一個已經存在的「對話」,但如果我嘗試創建一個新的,我得到這個錯誤:

ActiveRecord::RecordNotSaved at /conversations 
    You cannot call create unless the parent is saved 

是有什麼我在我的模型中失蹤?我已經嘗試了一切。

回答

11

更改以下行:

before_save :create_hashtags 

這樣:

after_save :create_hashtags 

說明: 你想做出create_hashtags ActiveRecord的回調包括在父保存子關聯。有許多方法可以將孩子保存在父母身上,但就您的情況而言,最簡單的方法是確保在執行子關聯之前保存父母記錄。

before_save回調被執行之前保存的對象,因此,沒有子關聯可以被保存(因爲父對象沒有保存)。相比之下,after_save在之後執行回調對象被保存 - 因此可以將子對象與該對象關聯。

+0

我簡直不敢相信那麼簡單。謝謝! –

+0

如果你有時間,你會介意解釋爲什麼是這樣嗎?我總共n00b。 –

+0

謝謝!事後看來是完美的。 – Phix

相關問題