0

In meiner Anwendung habe ich Modelle Post & Image. Mein Verein sind:Ruby on Rails - Run after_save nur wenn neue Datensätze

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 

Ich benutze cocoon gem für nested_forms

Wenn der Benutzer Bilder hinzufügt, ich habe einige globale Einstellungen, dass Benutzer auf Bilder anwenden können sie hinzufügen.

Ich tue es, indem Sie:

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 

Dies funktioniert gut, aber jetzt will ich es so, wenn sie post's images-edit will, ich will gleich anwenden Post globale EinstellungenNUR zu neue Datensätze.

Ich habe versucht, es zu tun, indem Sie:

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 

Dies überhaupt wurden nicht einen Datensatz hinzugefügt Einstellung & global nicht gearbeitet (noch auf new/create oder edit/update Aktion).

ich auch mit habe versucht:

after_save :global_settings, if: new_record? 

Dies gab mir Fehler: undefined method 'new_record?' for Post

Wie kann ich meine globale Einstellungen für alle neue Datensätze/neue Bilder nur anwenden?

ps: Ich habe versucht, eine Antwort auf SO zu finden, aber nichts hat funktioniert!

Antwort

0

Da images verfügt nicht über diese globalen Einstellungen bedeutet, dass Sie nur die function nur auf images ausführen kann, dass nicht alle fields hat.

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 
0

Dies kann für Sie arbeiten.

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 
+0

Dank @Vikram. Ja, das könnte funktionieren, wenn ich es nur anwenden wollte, wenn "post" neu ist, aber in meinem Fall möchte ich auch globale Einstellungen anwenden, wenn "post" nicht neu ist, aber hinzugefügte Bilder neu sind. – Rubioli

+0

In diesem Fall fügen Sie einfach den gleichen Code zum Bildmodus hinzu. Der Code zum Anwenden globaler Einstellungen sollte in image.rb sein. Was sagen? –