Ruby on Rails - Run after_save only if new records

937 Views Asked by At

In my application I have models Post & Image. My association are:

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

I use cocoon gem for nested_forms

When user is adding images, I have some global settings that user can apply to images they are adding.

I do it by doing:

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

This works fine, but now I want it so if they want to edit post's images, I want to apply same post global settings ONLY to new records.

I tried to do it by doing:

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

This didn't worked at all & global setting were not added to any record (nor on new/create or edit/update action).

I've also tried with:

after_save :global_settings, if: new_record?

This gave me error: undefined method 'new_record?' for Post

How can I only apply my global settings for all new records/new images?

ps: I tried to find some answer on SO, but nothing worked!

2

There are 2 best solutions below

0
On BEST ANSWER

Since images doesn't have those global settings means that you can only execute the function only on images that doesn't have all 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
2
On

This may work for you.

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