2010-02-24 13 views
5

Me gustaría que ActiveRecord establezca algún campo de base de datos automáticamente mediante devoluciones de llamada.Rails: atributo de configuración en after_create

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

En ./script/console hago

p = Product.create 
p 

p.locale campo no se establece. ¿Qué hice mal?

+0

Lo más probable es que Product.create falle, por lo que 'after_create' no se está llamando. Eche un vistazo a 'p.errors' –

Respuesta

7

before_create se llama antes de Base.save, ya que no guarda su llamada.

Editar:

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

Con esto en su controlador funcionará como quieres que lo haga.

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

Escribí mal sí. after_create tampoco funciona correctamente. – xpepermint

+0

Tiene que llamar a guardar para que se llame la devolución de llamada si coloca before_create o after_create. before_create es lo que estás buscando, pero debes llamar a guardar para que haga cualquier cosa. – Joey

+5

Esta respuesta es incorrecta. ActiveRecord :: Base.create activará una llamada a guardar y llamar de nuevo a guardar no solucionará el problema. – latortuga

1

lo que Joey dice es que after_create no funcionará.

uso before_create

+0

el problema estaba con algunos otros campos que tenía en mi modelo. Gracias... – xpepermint

2

Uso before_create para establecer los valores por defecto. Recuerde: after_create se dispara después de guardar en la base de datos. El uso de after_create solo inicializará los valores en la memoria, y requerirá adicional guardar para confirmar los valores inicializados en la base de datos.

Cuestiones relacionadas