纸张跟踪手动版本控制无法按预期工作

我正在使用paper_trail gem。 我的用例涉及在我明确想要而不是像on: [:update]类的回调时创建版本。

我这样做是在我的my_model.rb添加on: []并在我的模型实例上使用paper_trail.touch_with_version 。 问题是每当我第一次使用nil属性保存版本时这样做。 很奇怪,下次调用paper_trail.touch_with_version ,它会正确地保存它,并正确初始化所有属性。

来自rails控制台的示例日志:

 document = Document.first # document.paper_trail.touch_with_version document.versions.last.reify.name => nil document.paper_trail.touch_with_version document.versions.last.reify.name => "Sample document" 

真正奇怪的是,如果我尝试使用document.paper_trail.touch_with_version后跟document.versions.last.reify.name我正确获取document.versions.last.reify.name名称,但是如果我退出控制台并在第一次保存对象的属性时重复此过程那个版本再次nil

我可能正在做一些显而易见的事情,但在wiki上找不到任何关于此问题的内容。 有人可以向我解释我搞砸了哪里?

更新:我追溯了paper_trail库中的代码,找到了问题所在。 我在record_trail.rb找到了exception:

 # @api private def attribute_in_previous_version(attr_name) if @in_after_callback && RAILS_GTE_5_1 @record.attribute_before_last_save(attr_name.to_s) else @record.attribute_was(attr_name.to_s) end end 

所以在控制台中, @record.attribute_before_last_save(attr_name.to_s)给我nil但是如果我在我的控制台中尝试@record.attribute_was('name') ,它会给我正确的记录属性(在本例中为name)。