所以我在我的一个模型中创建了一个方法来解析文本体中的主题标签。这是模型:
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
我的模特中是否有遗漏的东西?我已经尝试了一切。
答案 0 :(得分:11)
更改以下行:
before_save :create_hashtags
到此:
after_save :create_hashtags
<强>解释强>:
您尝试对create_hashtags
进行的ActiveRecord回调涉及在父级上保存子关联。有许多方法可以将孩子保存在父母身上,但在您的情况下,最简单的方法就是确保在建立子(ren)关联之前保存父记录。
before_save
回调在保存对象之前执行,因此,不能保存子关联(因为尚未保存父对象)。相反,after_save
在保存对象后执行回调 - 因此可以将子项与对象关联。