ruby-on-rails - thoughtbot - paperclip validates
Rails Paperclip: update vs. update_attributes (3)
Me di cuenta de algo bastante extraño al intentar cargar una imagen a través de la gema de clip para mi modelo de usuario (bajo el atributo avatar). Por alguna razón, User.update y @ user.update_attributes se comportan de manera diferente. ¿Alguien sabe por qué esto es así?
#using @user.update_attributes(user_avatar_params)
def update_profile_pic
@user = User.find(params[:id])
@user.update_attributes(user_avatar_params)
puts @user.avatar_file_name.nil? # prints false as expected
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
#using User.update(@user.id, user_avatar_params)
def update_profile_pic
@user = User.find(params[:id])
User.update(@user.id, user_avatar_params)
puts @user.avatar_file_name.nil? # prints true although successfully saves
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
Y aquí están mis parámetros fuertes en el user_controller.rb
def user_avatar_params
params.require(:user).permit(:avatar)
end
ACTUALIZAR
Entonces, después de recibir respuestas rápidas y asombrosas, esto es lo que aprendí:
User.update
devuelve el objeto resultante si se guardó correctamente en la base de datos o no. Por lo tanto, User.update(@user.id, user_avatar_params)
no actualiza la variable @user si no realiza la asignación. @user.update_attributes(user_avatar_params)
cambia la variable @user implícitamente.
La solución para que esto funcione con el método de actualización es hacer @user = User.update(@user.id, user_avatar_params)
Para lo que vale, a partir de Rails #update
, #update
devuelve false
si la actualización falló, no simplemente el objeto por el cual falló la actualización. Además, #update_attributes
es simplemente un alias de #update
ahora.
Por cierto, #update_attributes
quedará en desuso de Rails 6 (aunque esto aún no se ha publicado)
por favor, eche un vistazo a
- https://github.com/rails/rails/pull/31998
- https://github.com/rails/rails/commit/5645149d3a27054450bd1130ff5715504638a5f5
para más detalles.
ActiveRecord.update
tiene un comportamiento que puede estar causándote la expulsión:
Actualiza un objeto (o varios objetos) y lo guarda en la base de datos, si pasan las validaciones. El objeto resultante se devuelve si el objeto se guardó correctamente en la base de datos o no. http://apidock.com/rails/ActiveRecord/Base/update/class
Sin embargo, los update_attributes
solo devolverán false
.
Ambos utilizan validaciones a nivel de modelo y, por lo tanto, ambos deben guardar o no guardar igualmente. Sin embargo, los valores de retorno serán diferentes.
Como señaló @RoaringStones, la solución es utilizar
user = User.update(user.id, user_avatar_params)