active_record_better_dependent_error_messages 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +12 -0
- data/lib/active_record_better_dependent_error_messages.rb +2 -0
- data/lib/active_record_better_dependent_error_messages/destroy_module.rb +1 -1
- data/lib/active_record_better_dependent_error_messages/destroy_validator.rb +22 -4
- data/lib/active_record_better_dependent_error_messages/errors_collector.rb +40 -0
- data/lib/active_record_better_dependent_error_messages/save_module.rb +10 -0
- data/lib/active_record_better_dependent_error_messages/version.rb +1 -1
- metadata +65 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d6ff57c47d56bcc5839e00341215cd0ce6c1acba1367ca7cf8c74044e2bd0857
|
4
|
+
data.tar.gz: 9e6d9be7924d9ae510c0b416ef96af83a5b4fba56cf55c4bcbb807bc272c4026
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b5a02c387eaf465974fab7c6874037f50d462c7a669ca6da557e90ae69edee10b912d53a89dd7813c47769b1f83af5d417dd47325c7b72703ed824329be317b
|
7
|
+
data.tar.gz: ce22197b91a3875b1493ebd5325ee5e10f8f6221a1030aea92d043fedd19fb8c4364b3c1b54bba5ed8113ecd2cf7ae2994fd7c787b521206984ab7b8a5627fee
|
data/README.md
CHANGED
@@ -28,6 +28,18 @@ class MyModel < ApplicationRecord
|
|
28
28
|
end
|
29
29
|
```
|
30
30
|
|
31
|
+
You can add a custom error message like this:
|
32
|
+
```yaml
|
33
|
+
en:
|
34
|
+
activerecord:
|
35
|
+
errors:
|
36
|
+
models:
|
37
|
+
user:
|
38
|
+
attributes:
|
39
|
+
base:
|
40
|
+
cannot_delete_because_of_restriction: Cannot delete because the user has dependent %{association_name}
|
41
|
+
```
|
42
|
+
|
31
43
|
## Contributing
|
32
44
|
Contribution directions go here.
|
33
45
|
|
@@ -31,13 +31,27 @@ private
|
|
31
31
|
if association.macro == :has_one
|
32
32
|
has_one_model = model.__send__(association.name)
|
33
33
|
|
34
|
-
if has_one_model
|
35
|
-
root_model.errors.add(
|
34
|
+
if has_one_model && !has_error?
|
35
|
+
root_model.errors.add(
|
36
|
+
:base,
|
37
|
+
:cannot_delete_because_of_restriction,
|
38
|
+
association_name: association.klass.model_name.human(count: 1).downcase,
|
39
|
+
count: 1,
|
40
|
+
message: "Cannot delete because of #{trace_as_string} has dependent record: #{association.name} with ID: #{has_one_model.id}",
|
41
|
+
model_name: model.model_name.human.downcase
|
42
|
+
)
|
36
43
|
end
|
37
|
-
elsif association.macro == :has_many
|
44
|
+
elsif association.macro == :has_many && !has_error?
|
38
45
|
ids = model.__send__(association.name).pluck(:id)
|
39
46
|
if ids.any?
|
40
|
-
root_model.errors.add(
|
47
|
+
root_model.errors.add(
|
48
|
+
:base,
|
49
|
+
:cannot_delete_because_of_restriction,
|
50
|
+
association_name: association.klass.model_name.human(count: 2).downcase,
|
51
|
+
count: ids.length,
|
52
|
+
message: "Cannot delete because of #{trace_as_string} has dependent records: #{association.name} with IDs: #{ids.join(", ")}",
|
53
|
+
model_name: model.model_name.human.downcase
|
54
|
+
)
|
41
55
|
end
|
42
56
|
end
|
43
57
|
end
|
@@ -54,6 +68,10 @@ private
|
|
54
68
|
end
|
55
69
|
end
|
56
70
|
|
71
|
+
def has_error?
|
72
|
+
root_model.errors.details[:base] && root_model.errors.details[:base].any? { |error| error[:error] == :cannot_delete_because_of_restriction }
|
73
|
+
end
|
74
|
+
|
57
75
|
def trace_as_string
|
58
76
|
trace.map do |model|
|
59
77
|
"#{model.class.name}(#{model.id})"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class ActiveRecordBetterDependentErrorMessages::ErrorsCollector
|
2
|
+
attr_reader :model, :root_model
|
3
|
+
|
4
|
+
def self.call(model:, root_model: nil)
|
5
|
+
root_model ||= model
|
6
|
+
|
7
|
+
collector = ActiveRecordBetterDependentErrorMessages::ErrorsCollector.new(model: model, root_model: root_model)
|
8
|
+
collector.collect!
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(model:, root_model:)
|
12
|
+
@model = model
|
13
|
+
@root_model = root_model
|
14
|
+
end
|
15
|
+
|
16
|
+
def collect!
|
17
|
+
model._reflections.each do |reflection_name, reflection|
|
18
|
+
association = model.association(reflection_name)
|
19
|
+
|
20
|
+
next if reflection.options[:dependent] != :destroy
|
21
|
+
|
22
|
+
if reflection.macro == :has_many
|
23
|
+
model.__send__(reflection_name).each do |sub_model|
|
24
|
+
scan_sub_model_for_errors(sub_model)
|
25
|
+
ActiveRecordBetterDependentErrorMessages::ErrorsCollector.(model: sub_model, root_model: model)
|
26
|
+
end
|
27
|
+
elsif reflection.macro == :has_one
|
28
|
+
sub_model = model.__send__(reflection_name)
|
29
|
+
scan_sub_model_for_errors(sub_model)
|
30
|
+
ActiveRecordBetterDependentErrorMessages::ErrorsCollector.(model: sub_model, root_model: model)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def scan_sub_model_for_errors(sub_model)
|
36
|
+
return if sub_model.errors.none?
|
37
|
+
|
38
|
+
root_model.errors.add(:base, sub_model.errors.full_messages.join(". "))
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module ActiveRecordBetterDependentErrorMessages::SaveModule
|
2
|
+
def update(*args)
|
3
|
+
super
|
4
|
+
rescue ActiveRecord::RecordNotDestroyed => e
|
5
|
+
raise e unless errors.empty?
|
6
|
+
|
7
|
+
ActiveRecordBetterDependentErrorMessages::ErrorsCollector.(model: self)
|
8
|
+
false
|
9
|
+
end
|
10
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_better_dependent_error_messages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaspernj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 6.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: factory_bot_rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-rails
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
25
67
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
68
|
+
version: '0'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: sqlite3
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +80,20 @@ dependencies:
|
|
38
80
|
- - ">="
|
39
81
|
- !ruby/object:Gem::Version
|
40
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: tzinfo-data
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
41
97
|
description: A gem that makes better dependent error messages telling exactly which
|
42
98
|
relationship tree failed with which ID's.
|
43
99
|
email:
|
@@ -63,6 +119,8 @@ files:
|
|
63
119
|
- lib/active_record_better_dependent_error_messages/destroy_module.rb
|
64
120
|
- lib/active_record_better_dependent_error_messages/destroy_validator.rb
|
65
121
|
- lib/active_record_better_dependent_error_messages/engine.rb
|
122
|
+
- lib/active_record_better_dependent_error_messages/errors_collector.rb
|
123
|
+
- lib/active_record_better_dependent_error_messages/save_module.rb
|
66
124
|
- lib/active_record_better_dependent_error_messages/version.rb
|
67
125
|
- lib/tasks/active_record_better_dependent_error_messages_tasks.rake
|
68
126
|
homepage: https://github.com/kaspernj/active-record-better-dependent-error-messages
|
@@ -84,8 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
142
|
- !ruby/object:Gem::Version
|
85
143
|
version: '0'
|
86
144
|
requirements: []
|
87
|
-
|
88
|
-
rubygems_version: 2.6.8
|
145
|
+
rubygems_version: 3.0.6
|
89
146
|
signing_key:
|
90
147
|
specification_version: 4
|
91
148
|
summary: A gem that makes better dependent error messages telling exactly which relationship
|