paper_trail 4.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6cf60ba027274553881419d2024a86547be00d2
4
- data.tar.gz: 57495d17ebfa11d24a17cf7d65ba5e67aca92816
3
+ metadata.gz: 047fe27b3f2154c19030502f4d129dcdd2873146
4
+ data.tar.gz: 6b6f268b260b459e0e6df8340ec9d33cb5c07824
5
5
  SHA512:
6
- metadata.gz: d9c462e7bb9dfdf1404de3fb8de7484de342ab0516e0e8eaae67e3059a51e01d0e7c9b1699433857c2045bee768256ab811783ccc8568318cf14dc39c50bd6ff
7
- data.tar.gz: 1e8c8098fa91e2cb9af8fae20268beceba18e885948a629e5fada7d84d2023159254da16875341436ce620365fb9f28432e4a37159ac7a9c8bc8883a2afef409
6
+ metadata.gz: 49c10975deb4b0f20617b4b770a1f6b99d2980df4072dd71da1dc48c7da85e409c6eeadcbfcc74f86f239b320e7ae73f6d7d2f72971439a39330d6f353b9f33e
7
+ data.tar.gz: 3ecddc1755c7d139e04716582bbe136163605eb33354acaf7e520bc0178dfe7c9d184c8f673f4bb744440c4e7113a58017c6de4fca9262ff99575bee764d804d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 4.0.1
2
+
3
+ ### Breaking Changes
4
+
5
+ - None
6
+
7
+ ### Added
8
+
9
+ - None
10
+
11
+ ### Fixed
12
+
13
+ - [#636](https://github.com/airblade/paper_trail/issues/636) -
14
+ Should compile assets without a db connection
15
+ - [#589](https://github.com/airblade/paper_trail/pull/589) /
16
+ [#588](https://github.com/airblade/paper_trail/issues/588) -
17
+ Fixes timestamp for "create" versions
18
+
1
19
  ## 4.0.0
2
20
 
3
21
  This major release adds JSON column support in PostgreSQL, limited support for
@@ -5,7 +23,7 @@ versioning associations, various new configuration options, and a year's worth
5
23
  of bug fixes. Thanks to everyone who helped test the two betas and two release
6
24
  candidates.
7
25
 
8
- ### Changed
26
+ ### Breaking Changes
9
27
 
10
28
  - Using a Rails initializer to reopen PaperTrail::Version or otherwise extend
11
29
  PaperTrail is no longer recommended. An alternative is described in the
@@ -13,6 +31,9 @@ candidates.
13
31
  https://github.com/airblade/paper_trail/pull/492.
14
32
  - If you depend on the `RSpec` or `Cucumber` helpers, you must
15
33
  [require them in your test helper](https://github.com/airblade/paper_trail#testing).
34
+ - [#566](https://github.com/airblade/paper_trail/pull/566) - Removed deprecated
35
+ methods `paper_trail_on` and `paper_trail_off`. Use `paper_trail_on!` and
36
+ `paper_trail_off!` instead.
16
37
  - [#458](https://github.com/airblade/paper_trail/pull/458) - Version metadata
17
38
  (the `:meta` option) from AR attributes for `create` events will now save the
18
39
  current value instead of `nil`.
@@ -29,12 +50,6 @@ candidates.
29
50
  - `3da1f104` - `PaperTrail.config` and `PaperTrail.configure` are now
30
51
  identical: both return the `PaperTrail::Config` instance and also
31
52
  yield it if a block is provided.
32
-
33
- ### Removed
34
-
35
- - [#566](https://github.com/airblade/paper_trail/pull/566) - Removed deprecated
36
- methods `paper_trail_on` and `paper_trail_off`. Use `paper_trail_on!` and
37
- `paper_trail_off!` instead.
38
53
 
39
54
  ### Added
40
55
 
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,11 @@
1
+ # Contributing
2
+
3
+ Thanks for your interest in PaperTrail! We appreciate bug reports, feature
4
+ suggestions, and especially pull requests.
5
+
6
+ Please do not use github issues to ask usage questions. We simply don't have
7
+ time to answer them all. Instead, please ask usage questions on Stack Overflow.
8
+
9
+ http://stackoverflow.com/tags/papertrail
10
+
11
+ Thanks, and happy versioning :)
data/README.md CHANGED
@@ -1,72 +1,76 @@
1
- # PaperTrail [![Build Status][4]][5] [![Dependency Status][6]][7]
1
+ # PaperTrail
2
2
 
3
- PaperTrail lets you track changes to your models' data. It's good for auditing
4
- or versioning. You can see how a model looked at any stage in its lifecycle,
5
- revert it to any version, and even undelete it after it's been destroyed.
3
+ [![Build Status][4]][5] [![Dependency Status][6]][7]
4
+
5
+ Track changes to your models, for auditing or versioning. See how a model looked
6
+ at any stage in its lifecycle, revert it to any version, or restore it after it
7
+ has been destroyed.
6
8
 
7
9
  - [Features](#features)
8
10
  - [Compatibility](#compatibility)
9
11
  - [Installation](#installation)
10
12
  - [API Summary](#api-summary)
11
13
  - [Basic Usage](#basic-usage)
12
- - [Choosing Lifecycle Events To Monitor](#choosing-lifecycle-events-to-monitor)
13
- - [Choosing When To Save New Versions](#choosing-when-to-save-new-versions)
14
- - [Choosing Attributes To Monitor](#choosing-attributes-to-monitor)
15
- - [Reverting And Undeleting A Model](#reverting-and-undeleting-a-model)
16
- - [Navigating Versions](#navigating-versions)
14
+ - Limiting What is Versioned, and When
15
+ - [Choosing Lifecycle Events To Monitor](#choosing-lifecycle-events-to-monitor)
16
+ - [Choosing When To Save New Versions](#choosing-when-to-save-new-versions)
17
+ - [Choosing Attributes To Monitor](#choosing-attributes-to-monitor)
18
+ - [Turning PaperTrail Off/On](#turning-papertrail-offon)
19
+ - [Limiting the Number of Versions Created](#limiting-the-number-of-versions-created)
20
+ - Working With Versions
21
+ - [Reverting And Undeleting A Model](#reverting-and-undeleting-a-model)
22
+ - [Navigating Versions](#navigating-versions)
23
+ - [Diffing Versions](#diffing-versions)
24
+ - [Deleting Old Versions](#deleting-old-versions)
17
25
  - [Finding Out Who Was Responsible For A Change](#finding-out-who-was-responsible-for-a-change)
18
26
  - [Custom Version Classes](#custom-version-classes)
19
27
  - [Associations](#associations)
20
28
  - [Storing metadata](#storing-metadata)
21
- - [Diffing Versions](#diffing-versions)
22
- - [Turning PaperTrail Off/On](#turning-papertrail-offon)
23
29
  - [Using a custom serializer](#using-a-custom-serializer)
24
30
  - [SerializedAttributes support](#serializedattributes-support)
25
- - [Limiting the Number of Versions Created](#limiting-the-number-of-versions-created)
26
- - [Deleting Old Versions](#deleting-old-versions)
27
31
  - [Testing](#testing)
28
32
 
29
33
  ## Features
30
34
 
31
- * Stores every create, update and destroy (or only the lifecycle events you specify).
32
- * Does not store updates which don't change anything.
33
- * Allows you to specify attributes (by inclusion or exclusion) which must change for a Version to be stored.
34
- * Allows you to get at every version, including the original, even once destroyed.
35
- * Allows you to get at every version even if the schema has since changed.
36
- * Allows you to get at the version as of a particular time.
37
- * Option to automatically restore `has_one`, `has_many` and `has_many :through` associations as they were at the time.
38
- * Automatically records who was responsible via your controller. PaperTrail calls `current_user` by default, if it exists, but you can have it call any method you like.
39
- * Allows you to set who is responsible at model-level (useful for migrations).
40
- * Allows you to store arbitrary model-level metadata with each version (useful for filtering versions).
41
- * Allows you to store arbitrary controller-level information with each version, e.g. remote IP.
42
- * Can be turned off/on per class (useful for migrations).
43
- * Can be turned off/on per request (useful for testing with an external service).
44
- * Can be turned off/on globally (useful for testing).
45
- * No configuration necessary.
46
- * Stores everything in a single database table by default (generates migration for you), or can use separate tables for separate models.
47
- * Supports custom version classes so different models' versions can have different behaviour.
48
- * Supports custom name for versions association.
49
- * Thoroughly tested.
50
- * Threadsafe.
51
-
35
+ * Stores create, update and destroy events
36
+ * Does not store updates which don't change anything
37
+ * Support for versioning associated records
38
+ * Can store metadata with each version record
39
+ * Who was responsible for a change
40
+ * Arbitrary model-level metadata (useful for filtering versions)
41
+ * Arbitrary controller-level information e.g. remote IP
42
+ * Configurable
43
+ * No configuration necessary, but if you want to ..
44
+ * Configure which events (create, update and destroy) are versioned
45
+ * Configure which attributes must change for an update to be versioned
46
+ * Turn off/on by model, request, or globally
47
+ * Use separate tables for separate models
48
+ * Extensible
49
+ * Write a custom version class for complete control
50
+ * Write custom version classes for each of your models
51
+ * Work with versions
52
+ * Restore any version, including the original, even once destroyed
53
+ * Restore any version even if the schema has since changed
54
+ * Restore the version as of a particular time
55
+ * Thoroughly tested
56
+ * Threadsafe
52
57
 
53
58
  ## Compatibility
54
59
 
55
- Works with `ActiveRecord` 3+. Note: this code is on the `master` branch and tagged `v4.x`.
56
-
57
- Version 3 is on the branch named [`3.0-stable`][9] and is tagged `v3.x`, and works ActiveRecord 4 and ActiveRecord 3.
58
-
59
- Version 2 is on the branch named [`2.7-stable`][10] and is tagged `v2.x`, and works with Rails 3.
60
-
61
- The Rails 2.3 code is on the [`rails2`][11] branch and tagged `v1.x`. These branches are both stable with their respective versions of Rails but will not have new features added/backported to them.
60
+ | paper_trail | branch | tags | ruby | activerecord |
61
+ | ----------- | ---------- | ------ | -------- | ------------ |
62
+ | 4 | master | v4.x | >= 1.8.7 | >= 3.0, < 6 |
63
+ | 3 | 3.0-stable | v3.x | >= 1.8.7 | >= 3.0, < 5 |
64
+ | 2 | 2.7-stable | v2.x | >= 1.8.7 | >= 3.0, < 4 |
65
+ | 1 | rails2 | v1.x | >= 1.8.7 | >= 2.3, < 3 |
62
66
 
63
67
  ## Installation
64
68
 
65
- ### Rails 3 & 4
69
+ ### Rails 3 and 4
66
70
 
67
71
  1. Add PaperTrail to your `Gemfile`.
68
72
 
69
- `gem 'paper_trail', '~> 4.0.0'`
73
+ `gem 'paper_trail', '~> 4.0.1'`
70
74
 
71
75
  2. Generate a migration which will add a `versions` table to your database.
72
76
 
@@ -89,7 +93,7 @@ setting up your app with PaperTrail will look something like this:
89
93
 
90
94
  1. Add PaperTrail to your `Gemfile`.
91
95
 
92
- `gem 'paper_trail', '~> 4.0.0'`
96
+ `gem 'paper_trail', '~> 4.0.1'`
93
97
 
94
98
  2. Generate a migration to add a `versions` table to your database.
95
99
 
@@ -435,6 +439,122 @@ class Article < ActiveRecord::Base
435
439
  end
436
440
  ```
437
441
 
442
+ ## Turning PaperTrail Off/On
443
+
444
+ Sometimes you don't want to store changes. Perhaps you are only interested in
445
+ changes made by your users and don't need to store changes you make yourself in,
446
+ say, a migration -- or when testing your application.
447
+
448
+ You can turn PaperTrail on or off in three ways: globally, per request, or per
449
+ class.
450
+
451
+ ### Globally
452
+
453
+ On a global level you can turn PaperTrail off like this:
454
+
455
+ ```ruby
456
+ PaperTrail.enabled = false
457
+ ```
458
+
459
+ For example, you might want to disable PaperTrail in your Rails application's
460
+ test environment to speed up your tests. This will do it (note: this gets done
461
+ automatically for `RSpec` and `Cucumber`, please see the [Testing
462
+ section](#testing)):
463
+
464
+ ```ruby
465
+ # in config/environments/test.rb
466
+ config.after_initialize do
467
+ PaperTrail.enabled = false
468
+ end
469
+ ```
470
+
471
+ If you disable PaperTrail in your test environment but want to enable it for
472
+ specific tests, you can add a helper like this to your test helper:
473
+
474
+ ```ruby
475
+ # in test/test_helper.rb
476
+ def with_versioning
477
+ was_enabled = PaperTrail.enabled?
478
+ was_enabled_for_controller = PaperTrail.enabled_for_controller?
479
+ PaperTrail.enabled = true
480
+ PaperTrail.enabled_for_controller = true
481
+ begin
482
+ yield
483
+ ensure
484
+ PaperTrail.enabled = was_enabled
485
+ PaperTrail.enabled_for_controller = was_enabled_for_controller
486
+ end
487
+ end
488
+ ```
489
+
490
+ And then use it in your tests like this:
491
+
492
+ ```ruby
493
+ test "something that needs versioning" do
494
+ with_versioning do
495
+ # your test
496
+ end
497
+ end
498
+ ```
499
+
500
+ ### Per request
501
+
502
+ You can turn PaperTrail on or off per request by adding a
503
+ `paper_trail_enabled_for_controller` method to your controller which returns
504
+ `true` or `false`:
505
+
506
+ ```ruby
507
+ class ApplicationController < ActionController::Base
508
+ def paper_trail_enabled_for_controller
509
+ request.user_agent != 'Disable User-Agent'
510
+ end
511
+ end
512
+ ```
513
+
514
+ ### Per class
515
+
516
+ If you are about to change some widgets and you don't want a paper trail of your
517
+ changes, you can turn PaperTrail off like this:
518
+
519
+ ```ruby
520
+ Widget.paper_trail_off!
521
+ ```
522
+
523
+ And on again like this:
524
+
525
+ ```ruby
526
+ Widget.paper_trail_on!
527
+ ```
528
+
529
+ ### Per method call
530
+
531
+ You can call a method without creating a new version using `without_versioning`.
532
+ It takes either a method name as a symbol:
533
+
534
+ ```ruby
535
+ @widget.without_versioning :destroy
536
+ ```
537
+
538
+ Or a block:
539
+
540
+ ```ruby
541
+ @widget.without_versioning do
542
+ @widget.update_attributes :name => 'Ford'
543
+ end
544
+ ```
545
+
546
+ ## Limiting the Number of Versions Created
547
+
548
+ Configure `version_limit` to cap the number of versions saved per record. This
549
+ does not apply to `create` events.
550
+
551
+ ```ruby
552
+ # Limit: 4 versions per record (3 most recent, plus a `create` event)
553
+ PaperTrail.config.version_limit = 3
554
+ # Remove the limit
555
+ PaperTrail.config.version_limit = nil
556
+ ```
557
+
438
558
  ## Reverting And Undeleting A Model
439
559
 
440
560
  PaperTrail makes reverting to a previous version easy:
@@ -528,6 +648,85 @@ And you can perform `WHERE` queries for object versions based on attributes:
528
648
  PaperTrail::Version.where_object(content: "Hello", title: "Article")
529
649
  ```
530
650
 
651
+ ## Diffing Versions
652
+
653
+ There are two scenarios: diffing adjacent versions and diffing non-adjacent
654
+ versions.
655
+
656
+ The best way to diff adjacent versions is to get PaperTrail to do it for you.
657
+ If you add an `object_changes` text column to your `versions` table, either at
658
+ installation time with the `rails generate paper_trail:install --with-changes`
659
+ option or manually, PaperTrail will store the `changes` diff (excluding any
660
+ attributes PaperTrail is ignoring) in each `update` version. You can use the
661
+ `version.changeset` method to retrieve it. For example:
662
+
663
+ ```ruby
664
+ widget = Widget.create :name => 'Bob'
665
+ widget.versions.last.changeset
666
+ # {
667
+ # "name"=>[nil, "Bob"],
668
+ # "created_at"=>[nil, 2015-08-10 04:10:40 UTC],
669
+ # "updated_at"=>[nil, 2015-08-10 04:10:40 UTC],
670
+ # "id"=>[nil, 1]
671
+ # }
672
+ widget.update_attributes :name => 'Robert'
673
+ widget.versions.last.changeset
674
+ # {
675
+ # "name"=>["Bob", "Robert"],
676
+ # "updated_at"=>[2015-08-10 04:13:19 UTC, 2015-08-10 04:13:19 UTC]
677
+ # }
678
+ widget.destroy
679
+ widget.versions.last.changeset
680
+ # {}
681
+ ```
682
+
683
+ The `object_changes` are only stored for creation and updates, not when an
684
+ object is destroyed.
685
+
686
+ Please be aware that PaperTrail doesn't use diffs internally. When I designed
687
+ PaperTrail I wanted simplicity and robustness so I decided to make each version
688
+ of an object self-contained. A version stores all of its object's data, not a
689
+ diff from the previous version. This means you can delete any version without
690
+ affecting any other.
691
+
692
+ To diff non-adjacent versions you'll have to write your own code. These
693
+ libraries may help:
694
+
695
+ For diffing two strings:
696
+
697
+ * [htmldiff][19]: expects but doesn't require HTML input and produces HTML
698
+ output. Works very well but slows down significantly on large (e.g. 5,000
699
+ word) inputs.
700
+ * [differ][20]: expects plain text input and produces plain
701
+ text/coloured/HTML/any output. Can do character-wise, word-wise, line-wise,
702
+ or arbitrary-boundary-string-wise diffs. Works very well on non-HTML input.
703
+ * [diff-lcs][21]: old-school, line-wise diffs.
704
+
705
+ For diffing two ActiveRecord objects:
706
+
707
+ * [Jeremy Weiskotten's PaperTrail fork][22]: uses ActiveSupport's diff to return
708
+ an array of hashes of the changes.
709
+ * [activerecord-diff][23]: rather like ActiveRecord::Dirty but also allows you
710
+ to specify which columns to compare.
711
+
712
+ If you wish to selectively record changes for some models but not others you
713
+ can opt out of recording changes by passing `:save_changes => false` to your
714
+ `has_paper_trail` method declaration.
715
+
716
+ ## Deleting Old Versions
717
+
718
+ Over time your `versions` table will grow to an unwieldy size. Because each
719
+ version is self-contained (see the Diffing section above for more) you can
720
+ simply delete any records you don't want any more. For example:
721
+
722
+ ```sql
723
+ sql> delete from versions where created_at < 2010-06-01;
724
+ ```
725
+
726
+ ```ruby
727
+ PaperTrail::Version.delete_all ["created_at < ?", 1.week.ago]
728
+ ```
729
+
531
730
  ## Finding Out Who Was Responsible For A Change
532
731
 
533
732
  If your `ApplicationController` has a `current_user` method, PaperTrail will
@@ -670,6 +869,11 @@ end
670
869
 
671
870
  ## Associations
672
871
 
872
+ **Experimental Feature: Known Issues:**
873
+ [#542](https://github.com/airblade/paper_trail/issues/542),
874
+ [#590](https://github.com/airblade/paper_trail/issues/590).
875
+ See also: Caveats below.
876
+
673
877
  PaperTrail can restore three types of associations: Has-One, Has-Many, and
674
878
  Has-Many-Through. In order to do this, you will need to create a
675
879
  `version_associations` table, either at installation time with the `rails
@@ -884,7 +1088,7 @@ end
884
1088
 
885
1089
  ### Protected Attributes and Metadata
886
1090
 
887
- If you are using rails 3 or the [protected_attributes][17] gem you must declare
1091
+ If you are using rails 3 or the [protected_attributes][17] gem you must declare
888
1092
  your metadata columns to be `attr_accessible`.
889
1093
 
890
1094
  ```ruby
@@ -900,164 +1104,6 @@ end
900
1104
  If you're using [strong_parameters][18] instead of [protected_attributes][17]
901
1105
  then there is no need to use `attr_accessible`.
902
1106
 
903
- ## Diffing Versions
904
-
905
- There are two scenarios: diffing adjacent versions and diffing non-adjacent
906
- versions.
907
-
908
- The best way to diff adjacent versions is to get PaperTrail to do it for you.
909
- If you add an `object_changes` text column to your `versions` table, either at
910
- installation time with the `rails generate paper_trail:install --with-changes`
911
- option or manually, PaperTrail will store the `changes` diff (excluding any
912
- attributes PaperTrail is ignoring) in each `update` version. You can use the
913
- `version.changeset` method to retrieve it. For example:
914
-
915
- ```ruby
916
- widget = Widget.create :name => 'Bob'
917
- widget.versions.last.changeset # {'name' => [nil, 'Bob']}
918
- widget.update_attributes :name => 'Robert'
919
- widget.versions.last.changeset # {'name' => ['Bob', 'Robert']}
920
- widget.destroy
921
- widget.versions.last.changeset # {}
922
- ```
923
-
924
- Note PaperTrail only stores the changes for creation and updates; it doesn't
925
- store anything when an object is destroyed.
926
-
927
- Please be aware that PaperTrail doesn't use diffs internally. When I designed
928
- PaperTrail I wanted simplicity and robustness so I decided to make each version
929
- of an object self-contained. A version stores all of its object's data, not a
930
- diff from the previous version. This means you can delete any version without
931
- affecting any other.
932
-
933
- To diff non-adjacent versions you'll have to write your own code. These
934
- libraries may help:
935
-
936
- For diffing two strings:
937
-
938
- * [htmldiff][19]: expects but doesn't require HTML input and produces HTML
939
- output. Works very well but slows down significantly on large (e.g. 5,000
940
- word) inputs.
941
- * [differ][20]: expects plain text input and produces plain
942
- text/coloured/HTML/any output. Can do character-wise, word-wise, line-wise,
943
- or arbitrary-boundary-string-wise diffs. Works very well on non-HTML input.
944
- * [diff-lcs][21]: old-school, line-wise diffs.
945
-
946
- For diffing two ActiveRecord objects:
947
-
948
- * [Jeremy Weiskotten's PaperTrail fork][22]: uses ActiveSupport's diff to return
949
- an array of hashes of the changes.
950
- * [activerecord-diff][23]: rather like ActiveRecord::Dirty but also allows you
951
- to specify which columns to compare.
952
-
953
- If you wish to selectively record changes for some models but not others you
954
- can opt out of recording changes by passing `:save_changes => false` to your
955
- `has_paper_trail` method declaration.
956
-
957
- ## Turning PaperTrail Off/On
958
-
959
- Sometimes you don't want to store changes. Perhaps you are only interested in
960
- changes made by your users and don't need to store changes you make yourself in,
961
- say, a migration -- or when testing your application.
962
-
963
- You can turn PaperTrail on or off in three ways: globally, per request, or per
964
- class.
965
-
966
- ### Globally
967
-
968
- On a global level you can turn PaperTrail off like this:
969
-
970
- ```ruby
971
- PaperTrail.enabled = false
972
- ```
973
-
974
- For example, you might want to disable PaperTrail in your Rails application's
975
- test environment to speed up your tests. This will do it (note: this gets done
976
- automatically for `RSpec` and `Cucumber`, please see the [Testing
977
- section](#testing)):
978
-
979
- ```ruby
980
- # in config/environments/test.rb
981
- config.after_initialize do
982
- PaperTrail.enabled = false
983
- end
984
- ```
985
-
986
- If you disable PaperTrail in your test environment but want to enable it for
987
- specific tests, you can add a helper like this to your test helper:
988
-
989
- ```ruby
990
- # in test/test_helper.rb
991
- def with_versioning
992
- was_enabled = PaperTrail.enabled?
993
- was_enabled_for_controller = PaperTrail.enabled_for_controller?
994
- PaperTrail.enabled = true
995
- PaperTrail.enabled_for_controller = true
996
- begin
997
- yield
998
- ensure
999
- PaperTrail.enabled = was_enabled
1000
- PaperTrail.enabled_for_controller = was_enabled_for_controller
1001
- end
1002
- end
1003
- ```
1004
-
1005
- And then use it in your tests like this:
1006
-
1007
- ```ruby
1008
- test "something that needs versioning" do
1009
- with_versioning do
1010
- # your test
1011
- end
1012
- end
1013
- ```
1014
-
1015
- ### Per request
1016
-
1017
- You can turn PaperTrail on or off per request by adding a
1018
- `paper_trail_enabled_for_controller` method to your controller which returns
1019
- `true` or `false`:
1020
-
1021
- ```ruby
1022
- class ApplicationController < ActionController::Base
1023
- def paper_trail_enabled_for_controller
1024
- request.user_agent != 'Disable User-Agent'
1025
- end
1026
- end
1027
- ```
1028
-
1029
- ### Per class
1030
-
1031
- If you are about to change some widgets and you don't want a paper trail of your
1032
- changes, you can turn PaperTrail off like this:
1033
-
1034
- ```ruby
1035
- Widget.paper_trail_off!
1036
- ```
1037
-
1038
- And on again like this:
1039
-
1040
- ```ruby
1041
- Widget.paper_trail_on!
1042
- ```
1043
-
1044
- ### Per method call
1045
-
1046
- You can call a method without creating a new version using `without_versioning`.
1047
- It takes either a method name as a symbol:
1048
-
1049
- ```ruby
1050
- @widget.without_versioning :destroy
1051
- ```
1052
-
1053
- Or a block:
1054
-
1055
- ```ruby
1056
- @widget.without_versioning do
1057
- @widget.update_attributes :name => 'Ford'
1058
- end
1059
- ```
1060
-
1061
1107
  ## Using a custom serializer
1062
1108
 
1063
1109
  By default, PaperTrail stores your changes as a `YAML` dump. You can override
@@ -1091,6 +1137,17 @@ end
1091
1137
  Note: You don't need to use a particular serializer for the PostgreSQL `JSON`
1092
1138
  column type.
1093
1139
 
1140
+ #### Convert a column from text to json
1141
+
1142
+ Postgres' `alter column` command will not automatically convert a `text`
1143
+ column to `json`, but it can still be done with plain SQL.
1144
+
1145
+ ```sql
1146
+ alter table versions
1147
+ alter column object type json
1148
+ using object::json;
1149
+ ```
1150
+
1094
1151
  ## SerializedAttributes support
1095
1152
 
1096
1153
  PaperTrail has a config option that can be used to enable/disable whether
@@ -1110,32 +1167,6 @@ PaperTrail.config.serialized_attributes = false
1110
1167
  PaperTrail.serialized_attributes?
1111
1168
  ```
1112
1169
 
1113
- ## Limiting the Number of Versions Created
1114
-
1115
- Configure `version_limit` to cap the number of versions saved per record. This
1116
- does not apply to `create` events.
1117
-
1118
- ```ruby
1119
- # Limit: 4 versions per record (3 most recent, plus a `create` event)
1120
- PaperTrail.config.version_limit = 3
1121
- # Remove the limit
1122
- PaperTrail.config.version_limit = nil
1123
- ```
1124
-
1125
- ## Deleting Old Versions
1126
-
1127
- Over time your `versions` table will grow to an unwieldy size. Because each
1128
- version is self-contained (see the Diffing section above for more) you can
1129
- simply delete any records you don't want any more. For example:
1130
-
1131
- ```sql
1132
- sql> delete from versions where created_at < 2010-06-01;
1133
- ```
1134
-
1135
- ```ruby
1136
- PaperTrail::Version.delete_all ["created_at < ?", 1.week.ago]
1137
- ```
1138
-
1139
1170
  ## Testing
1140
1171
 
1141
1172
  You may want to turn PaperTrail off to speed up your tests. See the [Turning