2014-12-29 15 views
13

Ich habe etwas ziemlich merkwürdiges beim Versuch, ein Bild über die Büroklammer Edelstein für mein Benutzermodell (unter dem Avatar-Attribut) hochladen hochgeladen. Aus irgendeinem Grund verhalten sich User.update und @ user.update_attributes anders. Weiß jemand, warum das so ist?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 

Und hier ist mein starkes params in den user_controller.rb

def user_avatar_params 
    params.require(:user).permit(:avatar) 
end 

UPDATE

So nach dem Empfang prompt und genial Antworten das ist, was ich gelernt habe:

User.update Gibt das Ergebnisobjekt zurück, ob es erfolgreich in der Datenbank gespeichert wurde oder nicht. Daher aktualisiert die @ user-Variable nicht, wenn Sie die Zuweisung nicht vornehmen. @user.update_attributes(user_avatar_params) ändert implizit die Variable @user.

Die Lösung für diese mit der Update-Methode zu arbeiten, ist @user = User.update(@user.id, user_avatar_params)

+1

Als Affinitäten erwähnt User.update gibt das Objekt basierend auf dem Datensatz es aktualisiert. Es ist also grundsätzlich nicht dasselbe Objekt im Speicher, auf das der Benutzer var zeigt. Versuchen Sie: user = User.update (user.id, user_avatar_params) und ich glaube, dass Sie in beiden Fällen die gleichen Ergebnisse erhalten werden. BTW, ich denke, erwarteter Wert in 'user.avatar_file_name.nil?' sollte falsch sein, nicht wahr –

+0

Danke für den Fang @RoaringStones. Ich habe den Beitrag korrigiert. Ja, wenn ich '' '@user = User.update (user.id, user_avatar_params)' '' verwende, wird falsch wie erwartet ausgegeben. –

Antwort

12

ActiveRecord.update ein Verhalten zu tun hat, dass Sie Abwerfen werden können: „Aktualisiert ein Objekt (oder mehrere Objekte) und speichert sie in der Datenbank, wenn Validierungen bestanden werden. Das resultierende Objekt wird zurückgegeben, unabhängig davon, ob das Objekt erfolgreich in der Datenbank gespeichert wurde oder nicht. " http://apidock.com/rails/ActiveRecord/Base/update/class

Allerdings werden die update_attributes nur false zurückgeben.

Beide verwenden Model-level-Validierungen und beide sollten speichern oder nicht gleichermaßen speichern. Die Rückgabewerte werden jedoch unterschiedlich sein.

Wie @RoaringStones wies darauf hin, die Lösung ist "user = User.update (user.id, user_avatar_params)"

+0

Ja, ich habe versucht, diese im genau gleichen Szenario zu testen. –

28

Für was es wert ist zu verwenden, wie von Rails 4.0.2, #update kehrt false, wenn die Aktualisierung fehlgeschlagen, nicht einfach das Objekt, für das die Aktualisierung fehlgeschlagen ist. Des Weiteren ist #update_attributes einfach ein Alias ​​von #update.

Verwandte Themen