Tengo un modelo de usuario que tiene un atributo: credits. Quiero un simple botón que agregará 5 a créditos del usuario, a través de una ruta llamada "añadir" para que/usuarios/3/agregar sumaría 5 a los créditos del identificador de usuario = 3.Rieles: Actualizar atributo de modelo sin invocar callbacks
def add
@user = User.find(params[:id])
@user.credits += 5
redirect_to root_path
end
Eso es la parte relevante de mi controlador. El problema es que no quiero llamar a @ user.save porque tengo una devolución de llamada before_save que vuelve a encriptar la contraseña del usuario en función de la hora UTC actual. Simplemente quiero agregar 5 al atributo y evitar la devolución de llamada, nunca pensé que una cosa tan simple pudiera ser tan difícil.
EDIT:
He cambiado la devolución de llamada: before_create, aquí es mi nuevo código del controlador (parte pertinente):
def add
@user = User.find(params[:id])
@user.add_credits(5)
@user.save
flash[:success] = "Credits added!"
redirect_to root_path
end
y aquí está mi código en el modelo:
def add_credits(num)
self.credits = num
end
EDIT 2:
Ok, era un problema de validación que hizo que los cambios en "EDITAR" no funcionaran, pero aún me encantaría una respuesta a la pregunta original de actualizar sin devoluciones de llamada.
Proporcioné un enlace con una lista de los métodos que no desencadenan devoluciones de llamada, y tanto Finbarr como yo sugerimos utilizar una devolución de llamada condicional: ¿qué soluciones adicionales está buscando? –