active_record_better_dependent_error_messages 0.0.1 → 0.0.2

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
- 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