Der*_*Mar 25 ruby-on-rails paperclip
当我尝试通过paperclip gem为我的用户模型(在avatar属性下)上传图像时,我意识到了一些非常奇怪的事情.出于某种原因,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
Run Code Online (Sandbox Code Playgroud)
这是我在user_controller.rb中的强大参数
def user_avatar_params
params.require(:user).permit(:avatar)
end
Run Code Online (Sandbox Code Playgroud)
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)
jam*_*ant 46
对于它的价值,从Rails 4.0.2开始,如果更新失败则#update返回false,而不仅仅是更新失败的对象.进一步说明,#update_attributes它只是#update现在的别名.
aar*_*ing 20
ActiveRecord.update 有一种行为可能会让你失望:
如果验证通过,则更新对象(或多个对象)并将其保存到数据库.无论对象是否已成功保存到数据库,都会返回结果对象. http://apidock.com/rails/ActiveRecord/Base/update/class
然而,update_attributes意志才会回归false.
这两个都使用模型级验证,因此两者都应该保存或不保存.但是,返回值将不同.
正如@RoaringStones指出的那样,解决方案就是使用
user = User.update(user.id, user_avatar_params)
Run Code Online (Sandbox Code Playgroud)
iti*_*skj 14
顺便说一句,#update_attributes将从Rails 6中弃用(尽管尚未发布)
请看看
更多细节.
| 归档时间: |
|
| 查看次数: |
25721 次 |
| 最近记录: |