在ruby模型上获取错误:“除非保存父级,否则无法调用create”

时间:2013-10-31 16:14:29

标签: ruby-on-rails ruby activerecord models

所以我在我的一个模型中创建了一个方法来解析文本体中的主题标签。这是模型:

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

我的模特中是否有遗漏的东西?我已经尝试了一切。

1 个答案:

答案 0 :(得分:11)

更改以下行:

before_save :create_hashtags

到此:

after_save :create_hashtags

<强>解释: 您尝试对create_hashtags进行的ActiveRecord回调涉及在父级上保存子关联。有许多方法可以将孩子保存在父母身上,但在您的情况下,最简单的方法就是确保在建立子(ren)关联之前保存父记录。

before_save回调在保存对象之前执行,因此,不能保存子关联(因为尚未保存父对象)。相反,after_save保存对象后执行回调 - 因此可以将子项与对象关联。