我一直在使用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)
}
]