问题
I'm using the paper_trail
gem. My use case involves creating versions when I explicitly want to instead of on callbacks like on: [:update]
or something.
I did so by adding on: []
in my my_model.rb
and using paper_trail.touch_with_version
on my model instance. The problem is whenever I do this the first time the version is saved with nil
attributes. Weird enough, the next time call paper_trail.touch_with_version
it saves it correctly with all attributes correctly initialised.
Sample logs from my rails console:
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"
What's really peculiar is that if I try doing document.paper_trail.touch_with_version
followed by document.versions.last.reify.name
I correctly get name of my document but if I exit console and repeat this process the first time the attributes of the object saved in that version is again nil
.
I'm probably doing something obvious but didn't find anything on wiki that talks about this. Can someone explain to me where I'm messing up?
Update: I traced back the code in paper_trail
library and found where the issue is. I found the anomaly in 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
So in console the @record.attribute_before_last_save(attr_name.to_s)
is giving me nil
but if I try @record.attribute_was('name')
in my console it gives me the correct attribute(in this case name) of the record.
来源:https://stackoverflow.com/questions/48599246/paper-trail-manual-versioning-isnt-working-as-expected