En Ruby on Rails v3.2.8, usando la after_initialize
devolución de llamada ActiveRecord, puede llamar a un método en su modelo que asignará los valores predeterminados para un nuevo objeto.
La devolución de llamada after_initialize se activa para cada objeto que un buscador encuentra y crea una instancia, y after_initialize también se activa después de crear una instancia de los nuevos objetos ( consulte las devoluciones de llamada de ActiveRecord ).
Entonces, en mi opinión, debería verse así:
class Foo < ActiveRecord::Base
after_initialize :assign_defaults_on_new_Foo
...
attr_accessible :bar
...
private
def assign_defaults_on_new_Foo
# required to check an attribute for existence to weed out existing records
self.bar = default_value unless self.attribute_whose_presence_has_been_validated
end
end
Foo.bar = default_value
para esta instancia, a menos que la instancia contenga attribute_whose_presence_has_been_validated
previamente un guardado / actualización. El default_value
se utilizará entonces en conjunción con su visión para hacer que el formulario utilizando el default_value
para el bar
atributo.
En el mejor de los casos, esto es hacky ...
EDITAR - use 'new_record?' para comprobar si se crea una instancia desde una nueva llamada
En lugar de comprobar el valor de un atributo, utilice el new_record?
método integrado con rieles. Entonces, el ejemplo anterior debería verse así:
class Foo < ActiveRecord::Base
after_initialize :assign_defaults_on_new_Foo, if: 'new_record?'
...
attr_accessible :bar
...
private
def assign_defaults_on_new_Foo
self.bar = default_value
end
end
Esto es mucho más limpio. Ah, la magia de Rails, es más inteligente que yo.