Ruby on Rails - 运行 after_save 只有新记录

Ruby on Rails - Run after_save only if new records

在我的应用程序中,我有模型 PostImage。我的协会是:

class Post < ActiveRecord::Base
  has_many :images
  accepts_nested_attributes_for :images, reject_if: :image_rejectable?, allow_destroy: true

class Image < ActiveRecord::Base
  belongs_to :post

我用cocoon gem代替nested_forms

当用户添加图像时,我有一些全局设置,用户可以将其应用于他们正在添加的图像。

我是这样做的:

class Post < ActiveRecord::Base
  has_many :images
  accepts_nested_attributes_for :images, reject_if: :image_rejectable?, allow_destroy: true

  after_create :global_settings

  private

    def global_settings
      self.images.each { |image| image.update_attributes(
                            to_what: self.to_what,
                            added_to: self.added_to,
                            )
                      }
    end

这很好用,但现在我想要它,所以如果他们想要 edit post's images,我想应用相同的 post 全局设置 新记录

我试着这样做:

class Post < ActiveRecord::Base
  has_many :images
  accepts_nested_attributes_for :images, reject_if: :image_rejectable?, allow_destroy: true

  after_save :global_settings

  private

  def global_settings
    if new_record?
      self.images.each { |image| image.update_attributes(
          to_what: self.to_what,
          added_to: self.added_to,
      )
      }
    end
  end

这根本不起作用&全局设置没有添加到任何记录(也没有添加到new/createedit/update动作).

我也尝试过:

after_save :global_settings, if: new_record?

这给了我错误:undefined method 'new_record?' for Post

如何才能只对所有 新 records/new 图片应用我的 全局 设置?

ps:我试图在 SO 上找到一些答案,但没有任何效果!

这可能对你有用。

def global_settings
# if new_record? # Change this to
  if self.new_record?
  self.images.each { |image| image.update_attributes(
      to_what: self.to_what,
      added_to: self.added_to,
  )
  }
end

因为 images 没有那些 全局设置 意味着你只能在没有的 images 上执行 function没有全部 fields.

def global_settings
  self.images.each { |image|
    if image.to_what.blank?
      image.update_attributes(
          to_what: self.to_what,
          added_to: self.added_to
      )
    end
  }
end