我正在使用paper_trail
宝石。我的用例涉及在我明确想要而不是像on: [:update]
之类的回调时创建版本。
我是通过在我的on: []
中添加my_model.rb
并在我的模型实例上使用paper_trail.touch_with_version
来实现的。问题是每当我第一次使用nil
属性保存版本时这样做。很奇怪,下次调用paper_trail.touch_with_version
时,它会正确保存,并正确初始化所有属性。
我的rails控制台的示例日志:
document = Document.first
#<Document:0x0000123456
id: 1,
name: "Sample document">
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
我正确获取文档的名称但是如果我退出控制台并重复此过程第一次属性该版本中保存的对象再次为nil
。
我可能做了一些显而易见的事情,但在wiki上没有找到任何关于此问题的内容。有人可以向我解释我搞砸了哪里?
更新:我追溯了paper_trail
库中的代码,找到了问题所在。我在record_trail.rb
中找到了异常:
# @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')
,它会为我提供记录的正确属性(在本例中为名称)。