ユーザーモデルのPaperclip gemを介して(アバター属性の下で)画像をアップロードしようとすると、かなり奇妙なことに気付きました。何らかの理由で、User.updateと@ user.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
_
そして、これはuser_controller.rbの私の強力なパラメータです
_def user_avatar_params
params.require(:user).permit(:avatar)
end
_
[〜#〜] update [〜#〜]
だからプロンプトと素晴らしい応答を受け取った後、これは私が学んだことです:
_User.update
_は、データベースに正常に保存されたかどうかにかかわらず、結果のオブジェクトを返します。したがって、割り当てを行わない場合、User.update(@user.id, user_avatar_params)
は@user変数を更新しません。 @user.update_attributes(user_avatar_params)
は@user変数を暗黙的に変更します。
これがupdateメソッドで動作するための解決策は、@user = User.update(@user.id, user_avatar_params)
を実行することです
ActiveRecord.update
は、あなたを追い払うかもしれない振る舞いを持っています:
検証に合格した場合、オブジェクト(または複数のオブジェクト)を更新し、データベースに保存します。オブジェクトがデータベースに正常に保存されたかどうかにかかわらず、結果のオブジェクトが返されます。 http://apidock.com/Rails/ActiveRecord/Base/update/class
しかし update_attributes
は、単にfalse
を返します。
これらは両方ともモデルレベルの検証を使用するため、両方とも同じように保存する必要があります。ただし、戻り値は異なります。
@RoaringStonesが指摘したように、解決策は
user = User.update(user.id, user_avatar_params)
価値があるものについては、Rails 4.0.2、 #update
は、更新が失敗したオブジェクトだけでなく、更新が失敗した場合にfalse
を返します。さらに注意してください、 #update_attributes
は、単に #update
今。
ところで、 #update_attributes
Rails 6(これはまだリリースされていませんが)
見てください
詳細については。