pasé un tiempo buscando un bicho me quita de la utilización de este código. Mi base de datos estaba retrocediendo cada vez que traté de interceptar un atributo y cambiarlo a false
antes de guardar.
Estoy contribuyendo mi respuesta aquí porque este hilo fue el primer resultado de Google para realizar esta tarea, pero no cubrió todo el problema false
.
Si cualquiera de sus devoluciones de llamadas devuelve false
, todo se retrotraerá en el archivo db.
Estaba tratando de configurar una oferta para que no se acepte en la base de datos o @offer.accepted = false
. El problema era que esta línea hacía que todo el método devolviera falso y revertía todo el proceso.
me fijo lanzando en un rendimiento implícito true
después
código que funcionó:
before_save {|offer| offer.accepted = false; true}
Para llevar: Sus devoluciones de llamada no pueden regresar false
si se quiere que tengan éxito.
Fuente: rails 3 : Do i need to give return true in a before_save callback for an object.save to work?
Más sobre las devoluciones de llamada de ActiveRecord: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html – Zargony
Si tiene muchos ganchos así y/o muchas operaciones realizadas en atributos, también puede crear métodos para ellos y darles los nombres del método en lugar de lambdas. También puede ver [attribute-filters] (http://rubydoc.info/gems/attribute-filters/1.2.2/) gem que simplifica ese proceso si tiene muchas devoluciones de llamada que están diseñadas para cambiar los atributos. – siefca