web-dev-qa-db-ja.com

Rails Paperclip:update vs. update_attributes

ユーザーモデルの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)を実行することです

24
Derrick Mar

ActiveRecord.updateは、あなたを追い払うかもしれない振る舞いを持っています:

検証に合格した場合、オブジェクト(または複数のオブジェクト)を更新し、データベースに保存します。オブジェクトがデータベースに正常に保存されたかどうかにかかわらず、結果のオブジェクトが返されます。 http://apidock.com/Rails/ActiveRecord/Base/update/class

しかし update_attributesは、単にfalseを返します。

これらは両方ともモデルレベルの検証を使用するため、両方とも同じように保存する必要があります。ただし、戻り値は異なります。

@RoaringStonesが指摘したように、解決策は

user = User.update(user.id, user_avatar_params)
19
aaron-coding

価値があるものについては、Rails 4.0.2、 #update は、更新が失敗したオブジェクトだけでなく、更新が失敗した場合にfalseを返します。さらに注意してください、 #update_attributes は、単に #update 今。

44
jamesconant

ところで、 #update_attributes Rails 6(これはまだリリースされていませんが)

見てください

詳細については。

11
itiskj