【问题标题】:Getting error on ruby model: "You cannot call create unless the parent is saved"在 ruby​​ 模型上出现错误:“除非保存父级,否则您不能调用 create”
【发布时间】:2013-10-31 16:14:28
【问题描述】:

所以我在我的一个模型中创建了一个方法,用于解析正文中的主题标签。这是模型:

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

我的模型中是否缺少某些东西?我什么都试过了。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord models


    【解决方案1】:

    更改以下行:

    before_save :create_hashtags
    

    到这里:

    after_save :create_hashtags
    

    说明: 您尝试对 create_hashtags 进行的 ActiveRecord 回调涉及在父级上保存子关联。有多种方法可以将子项保存在父项上,但在您的情况下,最简单的方法是确保在创建子项关联之前保存父项记录。

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

    【讨论】:

    • 我不敢相信它这么容易。谢谢!
    • 如果您有时间,您介意解释一下为什么会这样吗?我是个普通人。
    • 谢谢!事后看来完全有道理。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多