使用Carrierwave gem删除图像并将其重新附加到相同的ActiveRecord模型

时间:2017-02-08 11:28:29

标签: ruby-on-rails activerecord rspec carrierwave

我们有一个类,用户,带有Carrierwave头像,其存在是必要的但不足以触发回调:

class User < ActiveRecord::Base
  # ... various other stuff

  before_update :do_stuff, if: :avatar_changed_and_stuff?

  mount_uploader :avatar, AvatarUploader

  def avatar_changed_and_stuff?
    # Check if any of a number of conditions has just been met, 
    # including avatar just having been added
  end
end

在测试中,这让我非常头疼。我喜欢这样做的方式是

  1. 构建满足所有#ac&amp; s条件的用户对象

  2. 对于每个条件,将其设为false,然后将其设为true,并检查#do_stuff是否发生

  3. 对于大多数其他条件,这只是意味着将属性设置为nil,然后返回到它的任何位置。但是因为Carrierwave会覆盖'avatar'属性,所以我不能只做user.update(avatar: nil)

    相反,遵循自述文件,我已用

    删除它
    user.remove_avatar!
    
    user.save
    

    问题是,当我在同一个测试中尝试重新附加一个文件时,就像我在测试准备[1]中那样,它不起作用 - user.avatar.file仍然是{{1} }。

    我花了一段时间浏览Carrierwave宝石的来源,但未能找到这种行为的原因。最后,我通过简单地生成记录的新实例来攻击它...

    nil

    ...然后继续对新对象进行测试。这是有效的,但是a)令人沮丧的是,我无法弄清楚为什么,b)它可怕的丑陋。有更好的方法吗?



    [1]就是这样:

    user_x = User.find user.id
    

0 个答案:

没有答案