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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a0a04498f2fbd313b0da51b8f73abf5b6c28b5e9
4
- data.tar.gz: 7bd5cfdf351a48964eb1c8538a6286db3e37612f
2
+ SHA256:
3
+ metadata.gz: d6ff57c47d56bcc5839e00341215cd0ce6c1acba1367ca7cf8c74044e2bd0857
4
+ data.tar.gz: 9e6d9be7924d9ae510c0b416ef96af83a5b4fba56cf55c4bcbb807bc272c4026
5
5
  SHA512:
6
- metadata.gz: b94f561f468a0ec7eb708449662d06a851cfeaba94f418524335202fedb67cc586367c658a6dc6ecb5c821172223e6578e524615bf6a058f61b284e97f06241b
7
- data.tar.gz: 3e903a6b729312e84344d2f5c4ce5595f1b73f1b313e9d9e9ad51532cf72142b5a822d78edf3fdd947d9dcc14685ba9b5fb90ec5785595eadafbc11d1aad239c
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
 
@@ -5,4 +5,6 @@ module ActiveRecordBetterDependentErrorMessages
5
5
 
6
6
  autoload :DestroyModule, "#{path}/destroy_module"
7
7
  autoload :DestroyValidator, "#{path}/destroy_validator"
8
+ autoload :ErrorsCollector, "#{path}/errors_collector"
9
+ autoload :SaveModule, "#{path}/save_module"
8
10
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecordBetterDependentErrorMessages::DestroyModule
2
- def destroy
2
+ def destroy(*_args)
3
3
  result = super
4
4
 
5
5
  if !result && errors.empty?
@@ -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(:base, "Cannot delete because of #{trace_as_string} has dependent record: #{association.name} with ID: #{has_one_model.id}")
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(:base, "Cannot delete because of #{trace_as_string} has dependent records: #{association.name} with IDs: #{ids.join(", ")}")
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
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordBetterDependentErrorMessages
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  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.1
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: 2017-09-29 00:00:00.000000000 Z
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: 5.1.3
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: 5.1.3
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
- rubyforge_project:
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