2010-02-24 15 views
5

Ich möchte ActiveRecord einige DB-Feld automatisch mithilfe von Rückrufen festlegen.Rails: Einstellung Attribut in after_create

class Product < ActiveRecord::Base 
    after_create :set_locale 
    def set_locale 
     self.locale = I18n.locale 
    end 
end 

In ./script/console ich tue, ist

p = Product.create 
p 

Feld p.locale nicht gesetzt. Was habe ich falsch gemacht?

+0

Höchstwahrscheinlich ist Product.create fehlgeschlagen, daher wird 'after_create' nicht aufgerufen. Schauen Sie sich 'p.errors' an. –

Antwort

7

before_create heißt vor Base.save, da Ihre nicht speichern wird nicht aufgerufen werden.

Edit:

class Product < ActiveRecord::Base 
    before_create :set_locale 
    def set_locale 
     self.locale = I18n.locale 
    end 
end 

Damit in Ihrem Controller funktioniert, wie Sie es wollen.

@product = Product.create # before_create will be called and locale will be set for the new product 
+0

Ich habe ja falsch geschrieben. after_create funktioniert auch nicht richtig. – xpepermint

+0

Sie müssen speichern aufrufen, damit der Callback aufgerufen wird, ob Sie before_create oder after_create eingeben. before_create ist das, wonach du suchst, aber du musst es aufrufen, um etwas zu tun. – Joey

+5

Diese Antwort ist falsch. ActiveRecord :: Base.create löst einen Speicheraufruf aus und das erneute Speichern des Anrufs behebt das Problem nicht. – latortuga

1

was Joey sagt ist, dass after_create wird nicht funktionieren.

Verwendung before_create

+0

Das Problem war mit einigen anderen Feldern, die ich in meinem Modell hatte. Danke... – xpepermint

2

Verwenden before_create Standardwerte einzustellen. Denken Sie daran: after_create wird gefeuert nach das Speichern in der Datenbank. Die Verwendung von after_create initialisiert nur die Werte im Speicher und erfordert zusätzlich save, um die initialisierten Werte in die Datenbank zu übernehmen.

Verwandte Themen