Você poderia explicar em detalhes o que o :before_savee :before_createRuby on Rails retornos de chamada são, eo que eles têm a ver com Rails validações? A validação ocorre após :before_saveou :before_create?
Você poderia explicar em detalhes o que o :before_savee :before_createRuby on Rails retornos de chamada são, eo que eles têm a ver com Rails validações? A validação ocorre após :before_saveou :before_create?
Respostas:
Em uma operação de criação no Rails, há seis retornos de chamada antes da operação do banco de dados e dois depois. Em ordem, são eles:
before_validationbefore_validation_on_createafter_validationafter_validation_on_createbefore_savebefore_create
after_createafter_saveAs operações de atualização têm exatamente o mesmo conjunto, exceto a leitura em updatevez de em createqualquer lugar (e UPDATE em vez de INSERT ).
A partir disso, é possível ver que a validação é realizada antes dos retornos de chamada before_savee before_create.
O before_saveocorre um pouco antes do before_create. Que eu saiba, nada acontece entre eles; mas before_savetambém será acionado nas operações de atualização, enquanto before_createserá acionado apenas no Cria.
after_saveou after_create?
after_saveou after_create, selfé o registro que acabou de ser salvo, pois existe após o salvamento. Que os campos inclui Autogenerated gosto id, created_at, updated_at.
before_createse também de que um novo objeto está sendo salvo no banco de dados, e não o createmétodo real que está sendo chamado. Assim, before_createainda pode ser acionado, mesmo a partir do savemétodo.
before_save3 e before_create5.
before_saveé chamado toda vez que um objeto é salvo. Assim, para objetos novos e existentes. (criar e atualizar ação)
before_createsomente antes da criação. Portanto, apenas para novos objetos (criar ação)
before_create vs before_save :on => :create
Às vezes, você precisa ter cuidado com a ordem dos retornos de chamada
Consulte aqui para obter mais detalhes:
http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/
before_save :on => :createnão funciona (pelo menos nos trilhos 3.2)
before_save :generate_api_key, :if => :new_record?
before_validation_on_createeafter_validation_on_createsão removidos a partir de trilhos 3 , em vez disso usarbefore_validationeafter_validation, respectivamente, com a opção:on => :create.