我有一个模型,它同时使用 Carrierwave 和 PaperTrail
进行版本控制。
我还使用 config.remove_previously_stored_files_after_update = false 配置了 Carrierwave,以便在更新时存储不同的文件(这是因为我想对照片进行版本控制)
问题是 PaperTrail
尝试存储照片中的整个 Ruby 对象(CarrierWave Uploader),而不是简单地存储一个字符串(即它的 url)
(版本表,列对象)
---
first_name: Foo
last_name: Bar
photo: !ruby/object:PhotoUploader
model: !ruby/object:Bla
attributes:
id: 2
first_name: Foo1
segundo_nombre: 'Bar1'
........
如何修复此问题以在照片版本中存储简单的字符串?
最佳答案
您可以在版本化模型上覆盖 item_before_change
,这样您就不会直接调用 uploader 访问器,而是使用 write_attribute
。或者,由于您可能想对多个模型执行此操作,因此您可以直接对该方法进行猴子修补,如下所示:
module PaperTrail
module Model
module InstanceMethods
private
def item_before_change
previous = self.dup
# `dup` clears timestamps so we add them back.
all_timestamp_attributes.each do |column|
previous[column] = send(column) if respond_to?(column) && !send(column).nil?
end
previous.tap do |prev|
prev.id = id
changed_attributes.each do |attr, before|
if defined?(CarrierWave::Uploader::Base) && before.is_a?(CarrierWave::Uploader::Base)
prev.send(:write_attribute, attr, before.url && File.basename(before.url))
else
prev[attr] = before
end
end
end
end
end
end
end
不确定这是否是最好的解决方案,但它似乎有效。
关于ruby-on-rails - Papertrail 和 Carrierwave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423279/