2010-05-14 6 views
12

Im Moment kann ich nicht einen Weg finden, einen Rückruf zwischen den Linien 1 und 2 hier zu generieren:Rails Rückruf für das Äquivalent von „after_new“

f = Foo.new 
f.some_call 
f.save! 

Gibt es eine Möglichkeit zu simulieren, was effektiv ein after_new Rückruf wäre ? Im Moment verwende ich after_initialize, aber es gibt potentielle Performance-Probleme bei der Verwendung, da es für viele verschiedene Ereignisse ausgelöst wird.

Antwort

36

Sie können das after_initialize Rückruf

# app/models/foo.rb 
class Foo < ActiveRecord::Base 
    after_initialize :some_call 

    def some_call 
    puts "Who you gonna call?" 
    end 
end 

# rails console 
> foo = Foo.new # => "Who you gonna call?" 
> foo = Foo.first # => "Who you gonna call?" 

after_initialize Vorsicht jedes Mal Active tun ein Foo.new (Anrufe wie new, find, first usw.) ausgelöst wird, sehen die Rails Guide

So haben Sie wahrscheinlich wollen etwas wie das after_initialize :some_call, :if => :new_record?

# app/models/foo.rb 
class Foo < ActiveRecord::Base 
    after_initialize :some_call, :if => :new_record? 

    def some_call 
    puts "Who you gonna call?" 
    end 
end 

# rails console 
> foo = Foo.new # => "Who you gonna call?" 
> foo = Foo.first 
2

Definieren Sie einen Konstruktor für Foo und tun Sie, was Sie dort tun müssen.

Eine alternative Lösung wäre zu prüfen mit after_initialize, aber das kann nicht ganz das, was Sie erwarten.

3

Wenn dies ein Active Record-Modell ist, dann ist after_initialize der richtige Weg, um Callbacks nach der Objekterstellung zu behandeln. Das Framework selbst macht gewisse Annahmen über die Art und Weise, wie Objekte aus der Datenbank erzeugt werden. Die Leistung sollte keine Rolle spielen, es sei denn, Sie haben eine lang andauernde Aufgabe im Callback ausgelöst. In diesem Fall müssen Sie wahrscheinlich die Strategie überdenken.

Wenn kein AR-Modell, können Sie eine Initialisierungsmethode in Ihrem Objekt erstellen und den Code dort platzieren.

Je nach dem, was Sie tun möchten, stehen eine Reihe anderer Rückrufe zur Verfügung, einschließlich after_create (wird aufgerufen, wenn ein neuer Datensatz erstellt wird).

+0

Hi, ja, es ist ein aktiver Datensatz, ich setze einige erforderliche Verknüpfungen vor dem Rendern der "neuen" Ansicht. –

Verwandte Themen