paper_trail 5.0.1 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CONTRIBUTING.md +2 -1
- data/.github/ISSUE_TEMPLATE.md +1 -1
- data/.rubocop_todo.yml +1 -1
- data/Appraisals +6 -10
- data/CHANGELOG.md +33 -0
- data/README.md +133 -94
- data/doc/warning_about_not_setting_whodunnit.md +32 -0
- data/lib/paper_trail.rb +0 -1
- data/lib/paper_trail/attribute_serializers/README.md +10 -0
- data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +58 -0
- data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
- data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
- data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
- data/lib/paper_trail/frameworks/rails/controller.rb +4 -4
- data/lib/paper_trail/has_paper_trail.rb +41 -22
- data/lib/paper_trail/reifier.rb +4 -3
- data/lib/paper_trail/serializers/json.rb +4 -4
- data/lib/paper_trail/serializers/yaml.rb +4 -4
- data/lib/paper_trail/version_concern.rb +10 -2
- data/lib/paper_trail/version_number.rb +2 -2
- data/paper_trail.gemspec +1 -1
- data/spec/models/widget_spec.rb +2 -1
- data/spec/modules/version_number_spec.rb +2 -1
- data/test/dummy/app/models/foo_habtm.rb +1 -0
- data/test/unit/associations_test.rb +24 -0
- data/test/unit/serializers/json_test.rb +11 -3
- data/test/unit/serializers/yaml_test.rb +4 -1
- metadata +10 -5
- data/lib/paper_trail/attributes_serialization.rb +0 -161
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83f408e34bbaf733c5fdab5ad37fc8c3718ab7ad
|
4
|
+
data.tar.gz: b1e73feb664e29d18946f3c526b1bb6b1ccec024
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b61edd25675bb0ea5254640920f04ff23aab1fc9dc729bc2bb27c5f4bd6774fb6e86df50d213d173a2892e7b2ef2e15240745e541d9f4fb0238c4b07574f6e56
|
7
|
+
data.tar.gz: 8b701f3921a8945fd3e7e55dbda82c7b716711e457f72caf7054dd502fd77a927ef5c5ebcf7d634f9c8465ba0bc8c44cc057220bea24cbaac1f5dbad7f2c9a96
|
data/.github/CONTRIBUTING.md
CHANGED
@@ -96,7 +96,8 @@ DB=postgres bundle exec rake
|
|
96
96
|
1. In the readme,
|
97
97
|
- remove "unreleased" from the doc versions table
|
98
98
|
- update any other references to version number
|
99
|
-
1. Commit
|
99
|
+
1. Commit
|
100
|
+
1. Tag with `git tag -a -m "v5.0.0" "v5.0.0"`
|
100
101
|
1. `git push --tags origin master`
|
101
102
|
1. `gem build paper_trail.gemspec`
|
102
103
|
1. `gem push paper_trail-5.0.0.gem`
|
data/.github/ISSUE_TEMPLATE.md
CHANGED
@@ -8,6 +8,6 @@ Please use our template
|
|
8
8
|
when reporting bugs.
|
9
9
|
|
10
10
|
For other questions, please see our contributing guide.
|
11
|
-
(https://github.com/airblade/paper_trail/blob/master/.github/CONTRIBUTING.
|
11
|
+
(https://github.com/airblade/paper_trail/blob/master/.github/CONTRIBUTING.md)
|
12
12
|
|
13
13
|
Thanks for your contribution!
|
data/.rubocop_todo.yml
CHANGED
data/Appraisals
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# `paper_trail.gemspec`.
|
3
3
|
#
|
4
4
|
# > The dependencies in your Appraisals file are combined with dependencies in
|
5
|
-
# > your Gemfile, so you don
|
5
|
+
# > your Gemfile, so you don't need to repeat anything that's the same for each
|
6
6
|
# > appraisal. If something is specified in both the Gemfile and an appraisal,
|
7
7
|
# > the version from the appraisal takes precedence.
|
8
8
|
# > https://github.com/thoughtbot/appraisal
|
@@ -26,15 +26,11 @@ appraise "ar4" do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
appraise "ar5" do
|
29
|
-
gem "activerecord", "5.0.0.
|
30
|
-
gem "activemodel", "5.0.0.
|
31
|
-
gem "actionpack", "5.0.0.
|
32
|
-
gem "railties", "5.0.0.
|
33
|
-
gem "rspec-rails",
|
34
|
-
gem "rspec-core", github: "rspec/rspec-core"
|
35
|
-
gem "rspec-expectations", github: "rspec/rspec-expectations"
|
36
|
-
gem "rspec-mocks", github: "rspec/rspec-mocks"
|
37
|
-
gem "rspec-support", github: "rspec/rspec-support"
|
29
|
+
gem "activerecord", "5.0.0.beta3"
|
30
|
+
gem "activemodel", "5.0.0.beta3"
|
31
|
+
gem "actionpack", "5.0.0.beta3"
|
32
|
+
gem "railties", "5.0.0.beta3"
|
33
|
+
gem "rspec-rails", "3.5.0.beta3"
|
38
34
|
gem 'rails-controller-testing'
|
39
35
|
# Sinatra stable conflicts with AR5's rack dependency
|
40
36
|
gem 'sinatra', github: 'sinatra/sinatra'
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
## 5.?.? (Unreleased)
|
2
|
+
|
3
|
+
### Breaking Changes
|
4
|
+
|
5
|
+
- None
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- None
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
- None
|
14
|
+
|
15
|
+
## 5.1.0 (2016-05-20)
|
16
|
+
|
17
|
+
### Breaking Changes
|
18
|
+
|
19
|
+
- None
|
20
|
+
|
21
|
+
### Added
|
22
|
+
|
23
|
+
- [#809](https://github.com/airblade/paper_trail/pull/809) -
|
24
|
+
Print warning if version cannot be saved.
|
25
|
+
|
26
|
+
### Fixed
|
27
|
+
|
28
|
+
- [#812](https://github.com/airblade/paper_trail/pull/812) -
|
29
|
+
Issue with saving HABTM associated objects using accepts_nested_attributes_for
|
30
|
+
- [#811](https://github.com/airblade/paper_trail/pull/811) -
|
31
|
+
Avoid unnecessary query in #record_destroy
|
32
|
+
- Improvements to documentation
|
33
|
+
|
1
34
|
## 5.0.1 (2016-05-04)
|
2
35
|
|
3
36
|
### Breaking Changes
|
data/README.md
CHANGED
@@ -19,34 +19,39 @@ has been destroyed.
|
|
19
19
|
|
20
20
|
## Table of Contents
|
21
21
|
|
22
|
-
- [
|
23
|
-
- [
|
24
|
-
- [
|
25
|
-
- [
|
26
|
-
-
|
27
|
-
|
28
|
-
- [Choosing
|
29
|
-
- [Choosing
|
30
|
-
- [
|
31
|
-
- [
|
32
|
-
-
|
33
|
-
|
34
|
-
- [
|
35
|
-
- [
|
36
|
-
- [
|
37
|
-
-
|
38
|
-
|
39
|
-
- [
|
40
|
-
- [
|
41
|
-
-
|
42
|
-
|
43
|
-
-
|
44
|
-
- [
|
45
|
-
- [
|
46
|
-
- [
|
47
|
-
- [
|
48
|
-
|
49
|
-
|
22
|
+
- [1. Introduction](#1-introduction)
|
23
|
+
- [1.a. Compatibility](#1a-compatibility)
|
24
|
+
- [1.b. Installation](#1b-installation)
|
25
|
+
- [1.c. Basic Usage](#1c-basic-usage)
|
26
|
+
- [1.d. API Summary](#1d-api-summary)
|
27
|
+
- [2. Limiting What is Versioned, and When](#2-limiting-what-is-versioned-and-when)
|
28
|
+
- [2.a. Choosing Lifecycle Events To Monitor](#2a-choosing-lifecycle-events-to-monitor)
|
29
|
+
- [2.b. Choosing When To Save New Versions](#2b-choosing-when-to-save-new-versions)
|
30
|
+
- [2.c. Choosing Attributes To Monitor](#2c-choosing-attributes-to-monitor)
|
31
|
+
- [2.d. Turning PaperTrail Off](#2d-turning-papertrail-off)
|
32
|
+
- [2.e. Limiting the Number of Versions Created](#2e-limiting-the-number-of-versions-created)
|
33
|
+
- [3. Working With Versions](#3-working-with-versions)
|
34
|
+
- [3.a. Reverting And Undeleting A Model](#3a-reverting-and-undeleting-a-model)
|
35
|
+
- [3.b. Navigating Versions](#3b-navigating-versions)
|
36
|
+
- [3.c. Diffing Versions](#3c-diffing-versions)
|
37
|
+
- [3.d. Deleting Old Versions](#3d-deleting-old-versions)
|
38
|
+
- [4. Saving More Information About Versions](#4-saving-more-information-about-versions)
|
39
|
+
- [4.a. Finding Out Who Was Responsible For A Change](#4a-finding-out-who-was-responsible-for-a-change)
|
40
|
+
- [4.b. Associations](#4b-associations)
|
41
|
+
- [4.c. Storing metadata](#4c-storing-metadata)
|
42
|
+
- [5. ActiveRecord](#5-activerecord)
|
43
|
+
- [5.a. Single Table Inheritance](#5a-single-table-inheritance-sti)
|
44
|
+
- [5.b. Configuring the `versions` Association](#5b-configuring-the-versions-association)
|
45
|
+
- [5.c. Generators](#5c-generators)
|
46
|
+
- [6. Extensibility](#6-extensibility)
|
47
|
+
- [6.a. Custom Version Classes](#6a-custom-version-classes)
|
48
|
+
- [6.b. Custom Serializer](#6b-custom-serializer)
|
49
|
+
- [7. Testing](#7-testing)
|
50
|
+
- [8. Sinatra](#8-sinatra)
|
51
|
+
|
52
|
+
## 1. Introduction
|
53
|
+
|
54
|
+
### 1.a. Compatibility
|
50
55
|
|
51
56
|
| paper_trail | branch | tags | ruby | activerecord |
|
52
57
|
| -------------- | ---------- | ------ | -------- | ------------ |
|
@@ -56,7 +61,7 @@ has been destroyed.
|
|
56
61
|
| 2 | 2.7-stable | v2.x | >= 1.8.7 | >= 3.0, < 4 |
|
57
62
|
| 1 | rails2 | v1.x | >= 1.8.7 | >= 2.3, < 3 |
|
58
63
|
|
59
|
-
|
64
|
+
### 1.b. Installation
|
60
65
|
|
61
66
|
1. Add PaperTrail to your `Gemfile`.
|
62
67
|
|
@@ -70,7 +75,8 @@ has been destroyed.
|
|
70
75
|
```
|
71
76
|
|
72
77
|
If using [rails_admin][38], you must enable the experimental
|
73
|
-
[Associations](#associations) feature.
|
78
|
+
[Associations](#associations) feature. For more information on this
|
79
|
+
generator, see [section 5.c. Generators](#5c-generators).
|
74
80
|
|
75
81
|
1. Add `has_paper_trail` to the models you want to track.
|
76
82
|
|
@@ -90,7 +96,7 @@ by adding a controller callback.
|
|
90
96
|
end
|
91
97
|
```
|
92
98
|
|
93
|
-
|
99
|
+
### 1.c. Basic Usage
|
94
100
|
|
95
101
|
Your models now have a `versions` method which returns the "paper trail" of
|
96
102
|
changes to your model.
|
@@ -146,7 +152,7 @@ Here's a helpful table showing what PaperTrail stores:
|
|
146
152
|
PaperTrail stores the values in the Model Before column. Most other
|
147
153
|
auditing/versioning plugins store the After column.
|
148
154
|
|
149
|
-
|
155
|
+
### 1.d. API Summary
|
150
156
|
|
151
157
|
When you declare `has_paper_trail` in your model, you get these methods:
|
152
158
|
|
@@ -156,7 +162,7 @@ class Widget < ActiveRecord::Base
|
|
156
162
|
end
|
157
163
|
|
158
164
|
# Returns this widget's versions. You can customise the name of the
|
159
|
-
# association.
|
165
|
+
# association, but overriding this method is not supported.
|
160
166
|
widget.versions
|
161
167
|
|
162
168
|
# Return the version this widget was reified from, or nil if it is live.
|
@@ -226,13 +232,11 @@ version.index
|
|
226
232
|
# Returns the event that caused this version (create|update|destroy).
|
227
233
|
version.event
|
228
234
|
|
229
|
-
# Query versions
|
235
|
+
# Query the `versions.object` column (or `object_changes` column), by
|
236
|
+
# attributes, using the SQL LIKE operator. Known issue: inconsistent results for
|
237
|
+
# numeric values due to limitations of SQL wildcard matchers against the
|
238
|
+
# serialized objects.
|
230
239
|
PaperTrail::Version.where_object(attr1: val1, attr2: val2)
|
231
|
-
|
232
|
-
# Query versions object_changes field by attributes (requires
|
233
|
-
# `object_changes` column on versions table).
|
234
|
-
# Also can't guarantee consistent query results for numeric values
|
235
|
-
# due to limitations of SQL wildcard matchers against the serialized objects.
|
236
240
|
PaperTrail::Version.where_object_changes(attr1: val1)
|
237
241
|
```
|
238
242
|
|
@@ -248,7 +252,9 @@ user_for_paper_trail
|
|
248
252
|
info_for_paper_trail
|
249
253
|
```
|
250
254
|
|
251
|
-
##
|
255
|
+
## 2. Limiting What is Versioned, and When
|
256
|
+
|
257
|
+
### 2.a. Choosing Lifecycle Events To Monitor
|
252
258
|
|
253
259
|
You can choose which events to track with the `on` option. For example, to
|
254
260
|
ignore `create` events:
|
@@ -283,7 +289,7 @@ a.versions.size # 3
|
|
283
289
|
a.versions.last.event # 'update'
|
284
290
|
```
|
285
291
|
|
286
|
-
|
292
|
+
#### Controlling the Order of AR Callbacks
|
287
293
|
|
288
294
|
The `has_paper_trail` method installs AR callbacks. If you need to control
|
289
295
|
their order, use the `paper_trail_on_*` methods.
|
@@ -307,7 +313,7 @@ The `paper_trail_on_destroy` method can be further configured to happen
|
|
307
313
|
`:after`. In PaperTrail 5, the default will be `:before`, to support
|
308
314
|
ActiveRecord 5. (see https://github.com/airblade/paper_trail/pull/683)
|
309
315
|
|
310
|
-
|
316
|
+
### 2.b. Choosing When To Save New Versions
|
311
317
|
|
312
318
|
You can choose the conditions when to add new versions with the `if` and
|
313
319
|
`unless` options. For example, to save versions only for US non-draft
|
@@ -320,13 +326,13 @@ class Translation < ActiveRecord::Base
|
|
320
326
|
end
|
321
327
|
```
|
322
328
|
|
323
|
-
|
329
|
+
#### Choosing Based on Changed Attributes
|
324
330
|
|
325
331
|
Starting with PaperTrail 4.0, versions are saved during an after-callback. If
|
326
332
|
you decide whether to save a new version based on changed attributes, please
|
327
333
|
use attribute_name_was instead of attribute_name.
|
328
334
|
|
329
|
-
|
335
|
+
### 2.c. Choosing Attributes To Monitor
|
330
336
|
|
331
337
|
You can ignore changes to certain attributes like this:
|
332
338
|
|
@@ -413,11 +419,11 @@ class Article < ActiveRecord::Base
|
|
413
419
|
end
|
414
420
|
```
|
415
421
|
|
416
|
-
|
422
|
+
### 2.d. Turning PaperTrail Off
|
417
423
|
|
418
424
|
PaperTrail is on by default, but sometimes you don't want to record versions.
|
419
425
|
|
420
|
-
|
426
|
+
#### Per Process
|
421
427
|
|
422
428
|
Turn PaperTrail off for all threads in a `ruby` process.
|
423
429
|
|
@@ -434,7 +440,7 @@ There is also a rails config option that does the same thing.
|
|
434
440
|
config.paper_trail.enabled = false
|
435
441
|
```
|
436
442
|
|
437
|
-
|
443
|
+
#### Per Request
|
438
444
|
|
439
445
|
Add a `paper_trail_enabled_for_controller` method to your controller.
|
440
446
|
|
@@ -446,14 +452,14 @@ class ApplicationController < ActionController::Base
|
|
446
452
|
end
|
447
453
|
```
|
448
454
|
|
449
|
-
|
455
|
+
#### Per Class
|
450
456
|
|
451
457
|
```ruby
|
452
458
|
Widget.paper_trail_off!
|
453
459
|
Widget.paper_trail_on!
|
454
460
|
```
|
455
461
|
|
456
|
-
|
462
|
+
#### Per Method
|
457
463
|
|
458
464
|
You can call a method without creating a new version using `without_versioning`.
|
459
465
|
It takes either a method name as a symbol:
|
@@ -470,7 +476,7 @@ Or a block:
|
|
470
476
|
end
|
471
477
|
```
|
472
478
|
|
473
|
-
|
479
|
+
### 2.e. Limiting the Number of Versions Created
|
474
480
|
|
475
481
|
Configure `version_limit` to cap the number of versions saved per record. This
|
476
482
|
does not apply to `create` events.
|
@@ -482,7 +488,9 @@ PaperTrail.config.version_limit = 3
|
|
482
488
|
PaperTrail.config.version_limit = nil
|
483
489
|
```
|
484
490
|
|
485
|
-
##
|
491
|
+
## 3. Working With Versions
|
492
|
+
|
493
|
+
### 3.a. Reverting And Undeleting A Model
|
486
494
|
|
487
495
|
PaperTrail makes reverting to a previous version easy:
|
488
496
|
|
@@ -519,7 +527,7 @@ You could even use PaperTrail to implement an undo system, [Ryan Bates has!][3]
|
|
519
527
|
If your model uses [optimistic locking][1] don't forget to [increment your
|
520
528
|
`lock_version`][2] before saving or you'll get a `StaleObjectError`.
|
521
529
|
|
522
|
-
|
530
|
+
### 3.b. Navigating Versions
|
523
531
|
|
524
532
|
You can call `previous_version` and `next_version` on an item to get it as it
|
525
533
|
was/became. Note that these methods reify the item for you.
|
@@ -575,7 +583,7 @@ And you can perform `WHERE` queries for object versions based on attributes:
|
|
575
583
|
PaperTrail::Version.where_object(content: "Hello", title: "Article")
|
576
584
|
```
|
577
585
|
|
578
|
-
|
586
|
+
### 3.c. Diffing Versions
|
579
587
|
|
580
588
|
There are two scenarios: diffing adjacent versions and diffing non-adjacent
|
581
589
|
versions.
|
@@ -640,7 +648,7 @@ If you wish to selectively record changes for some models but not others you
|
|
640
648
|
can opt out of recording changes by passing `:save_changes => false` to your
|
641
649
|
`has_paper_trail` method declaration.
|
642
650
|
|
643
|
-
|
651
|
+
### 3.d. Deleting Old Versions
|
644
652
|
|
645
653
|
Over time your `versions` table will grow to an unwieldy size. Because each
|
646
654
|
version is self-contained (see the Diffing section above for more) you can
|
@@ -654,7 +662,9 @@ sql> delete from versions where created_at < 2010-06-01;
|
|
654
662
|
PaperTrail::Version.delete_all ["created_at < ?", 1.week.ago]
|
655
663
|
```
|
656
664
|
|
657
|
-
##
|
665
|
+
## 4. Saving More Information About Versions
|
666
|
+
|
667
|
+
### 4.a. Finding Out Who Was Responsible For A Change
|
658
668
|
|
659
669
|
Set `PaperTrail.whodunnit=`, and that value will be stored in the version's
|
660
670
|
`whodunnit` column.
|
@@ -732,12 +742,12 @@ last_version.paper_trail_originator # 'Alice'
|
|
732
742
|
last_version.terminator # 'Bob'
|
733
743
|
```
|
734
744
|
|
735
|
-
|
745
|
+
#### Storing an ActiveRecord globalid in whodunnit
|
736
746
|
|
737
747
|
If you would like `whodunnit` to return an `ActiveRecord` object instead of a
|
738
748
|
string, please try the [paper_trail-globalid][37] gem.
|
739
749
|
|
740
|
-
|
750
|
+
### 4.b. Associations
|
741
751
|
|
742
752
|
**Experimental feature**, see caveats below.
|
743
753
|
|
@@ -843,7 +853,7 @@ widget.reload.wotsit # nil
|
|
843
853
|
rails until ActiveRecord 4.2 (https://github.com/rails/rails/pull/14359).
|
844
854
|
1. PaperTrail can't restore an association properly if the association record
|
845
855
|
can be updated to replace its parent model (by replacing the foreign key)
|
846
|
-
1. Currently PaperTrail only
|
856
|
+
1. Currently PaperTrail only supports a single `version_associations` table. The
|
847
857
|
implication is that you can only use a single table to store the versions for
|
848
858
|
all related models. Sorry for those who use multiple version tables.
|
849
859
|
1. PaperTrail only reifies the first level of associations, i.e., it does not
|
@@ -916,7 +926,7 @@ end
|
|
916
926
|
|
917
927
|
See [issue 113][16] for a discussion about this.
|
918
928
|
|
919
|
-
|
929
|
+
### 4.c. Storing Metadata
|
920
930
|
|
921
931
|
You can store arbitrary model-level metadata alongside each version like this:
|
922
932
|
|
@@ -936,7 +946,7 @@ PaperTrail will call your proc with the current article and store the result in
|
|
936
946
|
the `author_id` column of the `versions` table.
|
937
947
|
Don't forget to add any such columns to your `versions` table.
|
938
948
|
|
939
|
-
|
949
|
+
#### Advantages of Metadata
|
940
950
|
|
941
951
|
Why would you do this? In this example, `author_id` is an attribute of
|
942
952
|
`Article` and PaperTrail will store it anyway in a serialized form in the
|
@@ -950,7 +960,7 @@ those versions you want:
|
|
950
960
|
PaperTrail::Version.where(:author_id => author_id)
|
951
961
|
```
|
952
962
|
|
953
|
-
|
963
|
+
#### Metadata from Controllers
|
954
964
|
|
955
965
|
You can also store any information you like from your controller. Override
|
956
966
|
the `info_for_paper_trail` method in your controller to return a hash whose keys
|
@@ -964,7 +974,7 @@ class ApplicationController
|
|
964
974
|
end
|
965
975
|
```
|
966
976
|
|
967
|
-
|
977
|
+
#### Protected Attributes and Metadata
|
968
978
|
|
969
979
|
If you are using rails 3 or the [protected_attributes][17] gem you must declare
|
970
980
|
your metadata columns to be `attr_accessible`.
|
@@ -982,7 +992,9 @@ end
|
|
982
992
|
If you're using [strong_parameters][18] instead of [protected_attributes][17]
|
983
993
|
then there is no need to use `attr_accessible`.
|
984
994
|
|
985
|
-
##
|
995
|
+
## 5. ActiveRecord
|
996
|
+
|
997
|
+
### 5.a. Single Table Inheritance (STI)
|
986
998
|
|
987
999
|
PaperTrail supports [Single Table Inheritance][39], and even supports an
|
988
1000
|
un-versioned base model, as of 23ffbdc7e1.
|
@@ -999,7 +1011,50 @@ end
|
|
999
1011
|
However, there is a known issue when reifying [associations](#associations),
|
1000
1012
|
see https://github.com/airblade/paper_trail/issues/594
|
1001
1013
|
|
1002
|
-
|
1014
|
+
### 5.b. Configuring the `versions` Association
|
1015
|
+
|
1016
|
+
You may configure the name of the `versions` association by passing
|
1017
|
+
a different name to `has_paper_trail`.
|
1018
|
+
|
1019
|
+
```ruby
|
1020
|
+
class Post < ActiveRecord::Base
|
1021
|
+
has_paper_trail class_name: 'Version', versions: :drafts
|
1022
|
+
end
|
1023
|
+
|
1024
|
+
Post.new.versions # => NoMethodError
|
1025
|
+
```
|
1026
|
+
|
1027
|
+
Overriding (instead of configuring) the `versions` method is not supported.
|
1028
|
+
Overriding associations is not recommended in general.
|
1029
|
+
|
1030
|
+
### 5.c. Generators
|
1031
|
+
|
1032
|
+
PaperTrail has one generator, `paper_trail:install`. It writes, but does not
|
1033
|
+
run, a migration file. This migration adds (at least) the `versions` table. The
|
1034
|
+
most up-to-date documentation for this generator can be found by running `rails
|
1035
|
+
generate paper_trail:install --help`, but a copy is included here for
|
1036
|
+
convenience.
|
1037
|
+
|
1038
|
+
```
|
1039
|
+
Usage:
|
1040
|
+
rails generate paper_trail:install [options]
|
1041
|
+
|
1042
|
+
Options:
|
1043
|
+
[--with-changes], [--no-with-changes] # Store changeset (diff) with each version
|
1044
|
+
[--with-associations], [--no-with-associations] # Store transactional IDs to support association restoration
|
1045
|
+
|
1046
|
+
Runtime options:
|
1047
|
+
-f, [--force] # Overwrite files that already exist
|
1048
|
+
-p, [--pretend], [--no-pretend] # Run but do not make any changes
|
1049
|
+
-q, [--quiet], [--no-quiet] # Suppress status output
|
1050
|
+
-s, [--skip], [--no-skip] # Skip files that already exist
|
1051
|
+
|
1052
|
+
Generates (but does not run) a migration to add a versions table.
|
1053
|
+
```
|
1054
|
+
|
1055
|
+
## 6. Extensibility
|
1056
|
+
|
1057
|
+
### 6.a. Custom Version Classes
|
1003
1058
|
|
1004
1059
|
You can specify custom version subclasses with the `:class_name` option:
|
1005
1060
|
|
@@ -1016,13 +1071,13 @@ end
|
|
1016
1071
|
|
1017
1072
|
Unlike ActiveRecord's `class_name`, you'll have to supply the complete module path to the class (e.g. `Foo::BarVersion` if your class is inside the module `Foo`).
|
1018
1073
|
|
1019
|
-
|
1074
|
+
#### Advantages
|
1020
1075
|
|
1021
1076
|
1. For models which have a lot of versions, storing each model's versions in a
|
1022
1077
|
separate table can improve the performance of certain database queries.
|
1023
1078
|
1. Store different version [metadata](#storing-metadata) for different models.
|
1024
1079
|
|
1025
|
-
|
1080
|
+
#### Configuration
|
1026
1081
|
|
1027
1082
|
If you are using Postgres, you should also define the sequence that your custom
|
1028
1083
|
version class will use:
|
@@ -1068,7 +1123,7 @@ class Post < ActiveRecord::Base
|
|
1068
1123
|
end
|
1069
1124
|
```
|
1070
1125
|
|
1071
|
-
|
1126
|
+
### 6.b. Custom Serializer
|
1072
1127
|
|
1073
1128
|
By default, PaperTrail stores your changes as a `YAML` dump. You can override
|
1074
1129
|
this with the serializer config option:
|
@@ -1083,7 +1138,7 @@ method. These serializers are included in the gem for your convenience:
|
|
1083
1138
|
* [PaperTrail::Serializers::YAML][24] - Default
|
1084
1139
|
* [PaperTrail::Serializers::JSON][25]
|
1085
1140
|
|
1086
|
-
|
1141
|
+
#### PostgreSQL JSON column type support
|
1087
1142
|
|
1088
1143
|
If you use PostgreSQL, and would like to store your `object` (and/or
|
1089
1144
|
`object_changes`) data in a column of [type `json` or type `jsonb`][26], specify
|
@@ -1101,7 +1156,7 @@ end
|
|
1101
1156
|
If you use the PostgreSQL `json` or `jsonb` column type, you do not need
|
1102
1157
|
to specify a `PaperTrail.serializer`.
|
1103
1158
|
|
1104
|
-
|
1159
|
+
##### Convert existing YAML data to JSON
|
1105
1160
|
|
1106
1161
|
If you've been using PaperTrail for a while with the default YAML serializer
|
1107
1162
|
and you want to switch to JSON or JSONB, you're in a bit of a bind because
|
@@ -1153,7 +1208,7 @@ remove_column :versions, :old_object
|
|
1153
1208
|
If you use the optional `object_changes` column, don't forget to convert it
|
1154
1209
|
also, using the same technique.
|
1155
1210
|
|
1156
|
-
|
1211
|
+
##### Convert a Column from Text to JSON
|
1157
1212
|
|
1158
1213
|
If your `object` column already contains JSON data, and you want to change its
|
1159
1214
|
data type to `json` or `jsonb`, you can use the following [DDL][36]. Of course,
|
@@ -1182,12 +1237,12 @@ class ConvertVersionsObjectToJson < ActiveRecord::Migration
|
|
1182
1237
|
end
|
1183
1238
|
```
|
1184
1239
|
|
1185
|
-
## Testing
|
1240
|
+
## 7. Testing
|
1186
1241
|
|
1187
1242
|
You may want to turn PaperTrail off to speed up your tests. See [Turning
|
1188
1243
|
PaperTrail Off](#turning-papertrail-off) above.
|
1189
1244
|
|
1190
|
-
### Minitest
|
1245
|
+
### 7.a. Minitest
|
1191
1246
|
|
1192
1247
|
First, disable PT for the entire `ruby` process.
|
1193
1248
|
|
@@ -1227,7 +1282,7 @@ test "something that needs versioning" do
|
|
1227
1282
|
end
|
1228
1283
|
```
|
1229
1284
|
|
1230
|
-
### RSpec
|
1285
|
+
### 7.b. RSpec
|
1231
1286
|
|
1232
1287
|
PaperTrail provides a helper, `paper_trail/frameworks/rspec.rb`, that works with
|
1233
1288
|
[RSpec][27] to make it easier to control when `PaperTrail` is enabled during
|
@@ -1317,7 +1372,7 @@ matcher
|
|
1317
1372
|
|
1318
1373
|
```
|
1319
1374
|
|
1320
|
-
### Cucumber
|
1375
|
+
### 7.c. Cucumber
|
1321
1376
|
|
1322
1377
|
PaperTrail provides a helper for [Cucumber][28] that works similar to the RSpec
|
1323
1378
|
helper.If you wish to use the helper, you will need to require in your cucumber
|
@@ -1350,7 +1405,7 @@ test to help prevent data spillover between tests. If you are using PaperTrail
|
|
1350
1405
|
with Rails, the helper will automatically set the `PaperTrail.controller_info`
|
1351
1406
|
value to `{}` as well, again, to help prevent data spillover between tests.
|
1352
1407
|
|
1353
|
-
### Spork
|
1408
|
+
### 7.d. Spork
|
1354
1409
|
|
1355
1410
|
If you wish to use the `RSpec` or `Cucumber` helpers with [Spork][29], you will
|
1356
1411
|
need to manually require the helper(s) in your `prefork` block on your test
|
@@ -1373,7 +1428,7 @@ Spork.prefork do
|
|
1373
1428
|
end
|
1374
1429
|
```
|
1375
1430
|
|
1376
|
-
### Zeus or Spring
|
1431
|
+
### 7.e. Zeus or Spring
|
1377
1432
|
|
1378
1433
|
If you wish to use the `RSpec` or `Cucumber` helpers with [Zeus][30] or
|
1379
1434
|
[Spring][31], you will need to manually require the helper(s) in your test
|
@@ -1389,25 +1444,9 @@ require 'rspec/rails'
|
|
1389
1444
|
require 'paper_trail/frameworks/rspec'
|
1390
1445
|
```
|
1391
1446
|
|
1392
|
-
##
|
1393
|
-
|
1394
|
-
Paper Trail has facilities to test against Postgres, Mysql and SQLite. To switch
|
1395
|
-
between DB engines you will need to export the DB variable for the engine you
|
1396
|
-
wish to test against.
|
1397
|
-
|
1398
|
-
Though be aware we do not have the ability to create the db's (except sqlite) for
|
1399
|
-
you. You can look at .travis.yml before_script for an example of how to create
|
1400
|
-
the db's needed.
|
1401
|
-
|
1402
|
-
```
|
1403
|
-
export DB=postgres
|
1404
|
-
export DB=mysql
|
1405
|
-
export DB=sqlite # this is default
|
1406
|
-
```
|
1407
|
-
|
1408
|
-
## Sinatra
|
1447
|
+
## 8. Sinatra
|
1409
1448
|
|
1410
|
-
|
1449
|
+
To configure PaperTrail for usage with [Sinatra][12], your `Sinatra`
|
1411
1450
|
app must be using `ActiveRecord` 3 or 4. It is also recommended to use the
|
1412
1451
|
[Sinatra ActiveRecord Extension][13] or something similar for managing your
|
1413
1452
|
applications `ActiveRecord` connection in a manner similar to the way `Rails`
|