ruby-on-rails - Papertrail 和 Carrierwave

标签 ruby-on-rails ruby-on-rails-3 carrierwave paper-trail-gem

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

相关文章:

ruby-on-rails - rails : How do I check if a column has a value?

ruby-on-rails - rails : how to display image from upload

ruby-on-rails-3 - 将参数传递给 uploader /从 uploader 中访问模型的属性/让用户选择缩略图大小

ruby-on-rails - Ruby - "can' t 将符号转换为整数“当尝试访问数组中的数据时

ruby-on-rails - 渲染与部分渲染和良率之间的差异

ruby-on-rails-3 - Sprockets and Rails 3 - 添加新的预编译js文件

ruby - 在 2 个 Rails API(单独的应用程序)之间共享模型

ubuntu - Controller 中的 Errno::EACCES#upload rails roo carrierwave on ubuntu

ruby-on-rails - 使所有输入字段位于同一行

ruby-on-rails - 为什么 Rubymine 无法识别我的命名空间继承 Controller ?