纸道编辑前一个对象

时间:2018-04-13 04:41:41

标签: paper-trail-gem

我一直在使用paper_trail 3.0很长时间,并且很高兴使用以下代码编辑以前的版本;

  # Update a level version with a new date or costing
  def update_version(version_id, data)
    version = PaperTrail::Version.find(version_id) # Find the version
    hash = YAML.load(version.object)               # Convert object to a hash
    hash["from_date"] = data[:from_date] unless data[:from_date].nil?    # Update date
    hash["cost_cents"] = data[:cost_cents] unless data[:cost_cents].nil? # Update cost
    version.object = YAML.dump(hash)               # Convert hash back into YAML
    version.save                                   # Save the version
  end

升级到paper trail 4.0后,由于我无法再进行version.object调用,因此已停止工作。有没有办法使用4.0版本的纸质版本和未来版本的纸质版本轻松编辑以前的版本?

更新

进一步研究之后我认为update_version可能有效但是它在paper_trail 4.0中的创建方式有所不同

这就是我创建版本的方式

  has_paper_trail :only => [:from_date],
    :if => Proc.new { |level|
      level.versions.count == 0 || level.versions.item.first != nil && (level.versions.first.item.from_date.nil? || level.from_date > level.versions.first.item.from_date)
    }

在这里放了一个byebug之后我发现level.versions.item是零!

更新

在我的测试中,在paper_trail 3.x但不在4.x中,我使用update_attributes。我注意到在两个版本之间,paper_trail以不同的方式处理update_attributes。上面的':if'规则在3.x中的update_attributes之前运行,但在4.x之后运行。这意味着我对'from_date'的检查不起作用。因此,它不会创建另一个版本。

答案

我必须将我的Proc移动到唯一一个这样的部分;

has_paper_trail :only => [:from_date => Proc.new { |level|
                              level.versions.count == 0 || level.versions.first.item != nil && (level.versions.first.item.from_date.nil? || level.from_date > level.versions.first.item.from_date)
                            }
                           ]

0 个答案:

没有答案