2010-02-24 6 views
5

Desidero che ActiveRecord imposti automaticamente alcuni campi DB utilizzando i callback.Rails: impostazione dell'attributo in after_create

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

In ./script/console lo faccio

p = Product.create 
p 

campo p.locale non è impostato. Che cosa ho fatto di sbagliato?

+0

Molto probabilmente Product.create non funziona, quindi 'after_create' non viene chiamato. Dai un'occhiata a 'p.errors' –

risposta

7

before_create viene chiamato prima dello Base.save, dal momento che non viene salvato.

Edit:

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

Con questo nel controller funzionerà come si desidera.

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

Ho scritto sbagliato sì. after_create inoltre non funziona correttamente. – xpepermint

+0

Devi chiamare il salvataggio per chiamare il callback sia che tu abbia messo before_create o after_create. before_create è ciò che stai cercando, ma devi chiamare save per farlo fare qualsiasi cosa. – Joey

+5

Questa risposta è sbagliata. ActiveRecord :: Base.create attiverà una chiamata di salvataggio e il richiamo di una nuova chiamata non risolverà il problema. – latortuga

1

quello che Joey sta dicendo è che after_create non funzionerà.

uso before_create

+0

il problema era con alcuni altri campi che avevo nel mio modello. Grazie... – xpepermint

2

Usa before_create per impostare i valori di default. Ricorda: after_create viene attivato dopo il il salvataggio nel database. L'utilizzo di after_create inizializzerà solo i valori in memoria e richiederà ulteriore per salvare i valori inizializzati nel database.

Problemi correlati