Rails Скрепка: обновление по сравнению с 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

ОБНОВИТЬ

Поэтому после получения быстрых и удивительных ответов это то, что я узнал:

User.update возвращает результирующий объект, успешно ли он был сохранен в базе данных или нет. Поэтому User.update(@user.id, user_avatar_params) не обновляет переменную @user, если вы не выполняете присвоение. @user.update_attributes(user_avatar_params) изменяет переменную @user неявно.

Решение для работы с методом обновления состоит в том, чтобы сделать @user = User.update(@user.id, user_avatar_params)

Ответы

Ответ 1

ActiveRecord.update имеет поведение, которое может отбросить вас:

Обновляет объект (или несколько объектов) и сохраняет его в базе данных, если проверки проходят. Получаемый объект возвращается, был ли объект успешно сохранен в базе данных или нет. http://apidock.com/rails/ActiveRecord/Base/update/class

Однако update_attributes просто вернет false.

Оба они используют проверки уровня модели, и поэтому оба должны сохранять или не сохранять одинаково. Однако возвращаемые значения будут разными.

Как отметил @RoaringStones, решение заключается в использовании

user = User.update(user.id, user_avatar_params)

Ответ 2

Для чего стоит, с Rails 4.0.2, #update возвращает false если обновление не удалось, а не просто объект, для которого обновление не удалось. Кроме того, #update_attributes - это просто псевдоним #update.