Mi sono reso conto di qualcosa di strano quando ho provato a caricare un'immagine tramite la gemma paperclip per il mio modello utente (sotto l'attributo avatar). Per qualche motivo, User.update e @ user.update_attributes si comportano diversamente. Qualcuno sa perché è così?Rails Paperclip: update vs. update_attributes
#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
Ed ecco la mia forti params nella user_controller.rb
def user_avatar_params
params.require(:user).permit(:avatar)
end
UPDATE
Così, dopo aver ricevuto risposte rapide e impressionante questo è quello che ho imparato:
User.update
restituisce l'oggetto risultante se è stato salvato correttamente nel database o meno. Pertanto, User.update(@user.id, user_avatar_params)
non aggiorna la variabile @user se non si effettua l'assegnazione. @user.update_attributes(user_avatar_params)
cambia implicitamente la variabile @user.
La soluzione per questo a lavorare con il metodo di aggiornamento è quello di fare @user = User.update(@user.id, user_avatar_params)
Come affinità menzionate User.update restituisce l'oggetto in base al record che ha aggiornato. Quindi in pratica non è lo stesso oggetto nella memoria a cui l'utente var punta. Prova: user = User.update (user.id, user_avatar_params) e credo che otterrai lo stesso risultato in entrambi i casi. BTW, penso che valore atteso in 'user.avatar_file_name.nil?' dovrebbe essere falso, non vero –
Grazie per la cattura @RoaringStones. Ho corretto il post. Sì, quando uso '' '@user = User.update (user.id, user_avatar_params)' '' stampa false come mi aspettavo. –