validates thoughtbot rails paper notidentifiedbyimagemagickerror game errors ruby-on-rails paperclip

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.



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)