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
.
Ответ 3
Кстати, #update_attributes
будет устаревшим из Rails 6 (хотя это еще не выпущено)
пожалуйста, взгляните на
Больше подробностей.