【问题标题】:Rails Paperclip: update vs. update_attributesRails Paperclip:更新与更新属性
【发布时间】:2014-12-29 05:53:31
【问题描述】:

在尝试通过回形针 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

这是我在 user_controller.rb 中的强大参数

def user_avatar_params
  params.require(:user).permit(:avatar)
end

【问题讨论】:

  • 正如亲缘关系所述,User.update 根据它更新的记录返回对象。所以它基本上不是用户 var 指向的内存中的同一个对象。试试:user = User.update(user.id, user_avatar_params) 我相信你会在这两种情况下得到相同的结果。顺便说一句,我认为“user.avatar_file_name.nil”中的预期值?应该是假的,不是真的
  • 感谢@RoaringStones。我已经更正了帖子。是的,当我使用 @user = User.update(user.id, user_avatar_params) 时,它按预期打印为 false。

标签: ruby-on-rails paperclip


【解决方案1】:

对于它的价值,从 Rails 4.0.2 开始,如果更新失败,#update 将返回 false,而不仅仅是更新失败的对象。进一步注意,#update_attributes 现在只是#update 的别名。

【讨论】:

  • “物有所值” 这很值得。我很高兴我向下滚动通过了接受的答案。
  • 很高兴它有帮助:)
【解决方案2】:

ActiveRecord.update 的行为可能会让你失望:

如果验证通过,则更新一个对象(或多个对象)并将其保存到数据库中。无论对象是否成功保存到数据库,都会返回结果对象。 http://apidock.com/rails/ActiveRecord/Base/update/class

但是update_attributes 只会返回false

这两个都使用模型级别的验证,因此两者都应该保存或不保存。但是,返回值会有所不同。

正如@RoaringStones 指出的那样,解决方案是使用

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

【讨论】:

  • 是的,我尝试在完全相同的场景中测试这些。
【解决方案3】:

顺便说一句,#update_attributes 将从 Rails 6 中被弃用(尽管它尚未发布)

请看一下

了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 2012-11-14
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多