gpt4 book ai didi

ruby-on-rails - Papertrail 和 Carrierwave

转载 作者:行者123 更新时间:2023-12-03 00:51:44 29 4
gpt4 key购买 nike

我有一个模型,它同时使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com