Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails Paperclip: update vs. update_attributes

I realized something quite strange when attempting to upload an image via the paperclip gem for my user model (under the avatar attribute). For some reason there User.update and @user.update_attributes behaves differently. Does anyone know why this is so?

#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 

And here is my strong params in the user_controller.rb

def user_avatar_params   params.require(:user).permit(:avatar) end 
like image 731
Derrick Mar Avatar asked Dec 29 '14 05:12

Derrick Mar


2 Answers

For what it's worth, as of Rails 4.0.2, #update returns false if the update failed, not simply the object which the update failed for. Of further note, #update_attributes is simply an alias of #update now.

like image 88
jamesconant Avatar answered Sep 21 '22 07:09

jamesconant


ActiveRecord.update has a behavior that may be throwing you off:

Updates an object (or multiple objects) and saves it to the database, if validations pass. The resulting object is returned whether the object was saved successfully to the database or not. http://apidock.com/rails/ActiveRecord/Base/update/class

However the update_attributes will just return false.

Both of these use Model-level validations and so both should save or not save equally. However, the return values will be different.

As @RoaringStones pointed out, the solution is to use

user = User.update(user.id, user_avatar_params) 
like image 33
aaron-coding Avatar answered Sep 20 '22 07:09

aaron-coding