nested_attributes_uniqueness_validator 0.1.0
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 +7 -0
- data/lib/nested_attributes_uniqueness_validator.rb +56 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ec9864638b33494a86dc827068c4015fa664f03c507d54eeb1a9abdfcb7d812d
|
4
|
+
data.tar.gz: ed1c345eea3e23e8ae6438be914d801cc5868c51f0cca64c5fb8d9d511c7815a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: de33c0b229540664afce51b7588380ad5596a871bb4ee1036c581335d9ad984416746809065d1e44dece21a8c7ae74405e9b44fdaad43eec9a21e42f55bfe744
|
7
|
+
data.tar.gz: 95859c3b79c5efc89e8ef8277c0a15a49df827013fe49c9c3304de4a3a57670bdd7c62b68e08cd585c9bdc467e3f77b64480c326f27c1519edc174af3cf6b8fb
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class NestedAttributesUniquenessValidator < ActiveModel::EachValidator
|
2
|
+
class MissingScopeError < StandardError; end
|
3
|
+
|
4
|
+
def validate_each(record, attribute, value)
|
5
|
+
parsed_options = parse_options(record)
|
6
|
+
scope = [parsed_options[:scope]].flatten.compact
|
7
|
+
|
8
|
+
raise MissingScopeError if scope.empty?
|
9
|
+
|
10
|
+
unless parsed_options[:allow_destroyed] == true
|
11
|
+
value = value.reject(&:marked_for_destruction?)
|
12
|
+
end
|
13
|
+
|
14
|
+
same_object = value.detect do |object|
|
15
|
+
value.select do |obj|
|
16
|
+
scope.map do |scope_attribute|
|
17
|
+
a = obj.send(scope_attribute)
|
18
|
+
b = object.send(scope_attribute)
|
19
|
+
|
20
|
+
if parsed_options[:allow_blank] == true
|
21
|
+
(a == b)
|
22
|
+
else
|
23
|
+
(a.present? || b.present?) && (a == b)
|
24
|
+
end
|
25
|
+
end.all?
|
26
|
+
end.count > 1
|
27
|
+
end
|
28
|
+
|
29
|
+
return unless same_object.present?
|
30
|
+
|
31
|
+
same_object.errors.add(
|
32
|
+
parsed_options[:attribute].presence || scope.first,
|
33
|
+
parsed_options[:message].presence || :taken
|
34
|
+
)
|
35
|
+
record.errors.add(attribute, parsed_options[:message].presence || :invalid)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def parse_options(record)
|
41
|
+
options.map.inject({}) do |hash, (key, value)|
|
42
|
+
hash.merge(key => parse_option(value, record))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_option(param, record)
|
47
|
+
case param
|
48
|
+
when Symbol
|
49
|
+
record.respond_to?(param) ? record.send(param) : param
|
50
|
+
when Proc
|
51
|
+
param.call(record)
|
52
|
+
else
|
53
|
+
param
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nested_attributes_uniqueness_validator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- João Mangilli
|
8
|
+
- Marcelo Alexandre
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2019-03-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activemodel
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '3.0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '3.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rspec
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '3.8'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '3.8'
|
42
|
+
description: |2
|
43
|
+
A uniqueness validator for nested attributes.
|
44
|
+
|
45
|
+
This gem solves the problem described in https://github.com/rails/rails/issues/4568.
|
46
|
+
email:
|
47
|
+
- joaoluissilvamangilli@gmail.com
|
48
|
+
- marcelobalexandre@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- lib/nested_attributes_uniqueness_validator.rb
|
54
|
+
homepage: https://github.com/joaomangilli/nested_attributes_uniqueness_validator
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.7.6
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Uniqueness validator for nested attributes.
|
78
|
+
test_files: []
|