No Ruby on Rails v3.2.8, usando o after_initialize
retorno de chamada ActiveRecord, você pode chamar um método em seu modelo que atribuirá os valores padrão para um novo objeto.
after_initialize callback é disparado para cada objeto que é encontrado e instanciado por um localizador, com after_initialize sendo disparado depois que novos objetos são instanciados também ( veja ActiveRecord Callbacks ).
Então, IMO, deve ser algo como:
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 instância, a menos que a instância contenha attribute_whose_presence_has_been_validated
anteriormente em salvar / atualizar. O default_value
será então usado em conjunto com sua visualização para renderizar o formulário usando o default_value
para o bar
atributo.
Na melhor das hipóteses, isso é hacky ...
EDITAR - usar 'new_record?' para verificar se instanciando de uma nova chamada
Em vez de verificar um valor de atributo, use o new_record?
método integrado com trilhos. Portanto, o exemplo acima deve ser semelhante a:
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
Isso é muito mais limpo. Ah, a magia do Rails - é mais inteligente do que eu.