脏属性更改: 自从何时更改集中的值变成了字符串(而不是对象)?

8

我正在使用乐观锁定来防止在竞争条件下人们覆盖彼此的更改。

自从我将Rails从 5.1 升级到 5.2 后,我的规范测试出现了问题,我追踪发现,在 changes 数组中,与文件上传相关的更改不再是 Uploader 元素,而是裸字符串。

之前:

[1] pry(#<User>)> change
=> [
    [0] #<AvatarUploader:0x007fcc7117bc00 # Value before
    [1] #<AvatarUploader:17bc0cc7100x997f # Current value

现在:

[1] pry(#<User>)> change
=> [
    [0] "image.jpg", # Value before
    [1] "avatar.png" # Current value
]

我该如何解决这个问题?

1
你能添加报错的规范以帮助我更好地理解问题吗? - sabhari karthik
2个回答

1

我没有找到为什么上述行为发生了改变,但我已经解决了这个问题。

之前的代码:

@user.changes.map do |attribute, change|
  unless ['updated_at', 'lock_version'].include? attribute
    StaleInfo.new resource:     resource,
                  attribute:    attribute,
                  value_before: change[0],
                  value_after:  change[1]
  end
end

现在的代码:

@user.changes.map do |attribute, change|
  unless ['updated_at', 'lock_version'].include? attribute
    StaleInfo.new resource:     resource,
                  attribute:    attribute,
                  value_before: resource.class.find(resource.id).send(attribute),
                  value_after:  resource.send(attribute)
  end
end

这种方式感觉有些奇怪,而且需要额外的数据库查询(以加载原始对象)。

0

这个问题似乎与CarrierWave 1.3.1中的其他奇怪问题相似。

尝试重新安装旧版本或尝试2.0.0,但似乎他们还没有解决那个问题。


谢谢。结果证明这与CarrierWave无关,而是与Rails有关。 - Joshua Muheim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接