prevent_destroy_if_any 0.1 → 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 +7 -0
- data/CHANGELOG.md +10 -0
- data/README.md +38 -28
- data/config/locales/en.yml +4 -0
- data/config/locales/es.yml +4 -0
- data/config/locales/fr.yml +4 -0
- data/lib/prevent_destroy_if_any.rb +19 -12
- data/lib/prevent_destroy_if_any/version.rb +1 -1
- data/prevent_destroy_if_any.gemspec +2 -1
- data/spec/prevent_destroy_if_any_spec.rb +9 -7
- data/spec/spec_helper.rb +2 -2
- metadata +70 -43
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b885f6dcbeaf3bcdd279b1118a1e5e9708acc89b
|
4
|
+
data.tar.gz: b9f2cb72b3c6d949c23529468bd4d9a1873d71f8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a64e8452ad65dd5ae1d2f4ca1853b5bfd6026df8c27304bfc50f85f43de5b03965a03d3e3d591f6c2ee75f228153f25241ac10deba14a5a235468ecc45502f1c
|
7
|
+
data.tar.gz: 00848b72ff168bd3c1ab551d35faaa700fe9668de6d841a1177afd2126eaffa5aed804d0e2bd91b3f88c764c02adb5b81a52ae73d8f257e8f1e404cc469370be
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Change Log
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
## 0.2 - 2014-11-04
|
5
|
+
### Added
|
6
|
+
- Ability to customize the error message
|
7
|
+
- Created the English, Spanish and French default error messages
|
8
|
+
|
9
|
+
## 0.1 - 2011-08-07
|
10
|
+
- Initial release
|
data/README.md
CHANGED
@@ -1,46 +1,56 @@
|
|
1
|
-
prevent_destroy_if_any
|
2
|
-
===
|
1
|
+
# prevent_destroy_if_any
|
3
2
|
|
4
3
|
This plugin adds ActiveRecord models a way to prevent destroy if specified `has_many`, `has_one` and/or `belongs_to` associations are present. This is achieved by adding a `before_destroy` callback that aborts the destroy and adds a base error on the instance when detecting associations.
|
5
4
|
|
6
5
|
It's inspired from [this stackoverflow answer](http://stackoverflow.com/questions/4054112/how-do-i-prevent-deletion-of-parent-if-it-has-child-records/4054170#4054170) and was created to factorize this solution when you need it for various models in an application.
|
7
6
|
|
8
|
-
It has been tested
|
7
|
+
It has been tested with ActiveRecord 3 and 4, with Ruby 1.9 and 2+.
|
9
8
|
|
10
|
-
Installation
|
11
|
-
---
|
9
|
+
## Installation
|
12
10
|
|
13
|
-
|
11
|
+
Add this line to your application’s Gemfile:
|
14
12
|
|
15
|
-
|
13
|
+
`gem 'prevent_destroy_if_any'`
|
16
14
|
|
17
|
-
|
18
|
-
Example usage
|
19
|
-
---
|
15
|
+
## Example usage
|
20
16
|
|
21
17
|
A Person model for which you want to prevent destroy when it has an associated user, projects or public profile. Destroy will work if it has associated logs.
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
```ruby
|
20
|
+
class Person < ActiveRecord::Base
|
21
|
+
belongs_to :user
|
22
|
+
has_many :projects
|
23
|
+
has_one :public_profile
|
24
|
+
has_many :logs
|
28
25
|
|
29
|
-
|
30
|
-
|
26
|
+
prevent_destroy_if_any :user, :projects, :public_profile
|
27
|
+
end
|
28
|
+
```
|
31
29
|
|
32
30
|
Then in Rails you can write your PeopleController destroy action like this:
|
33
31
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
```ruby
|
33
|
+
def destroy
|
34
|
+
person = Person.find params[:id]
|
35
|
+
if person.destroy
|
36
|
+
redirect_to people_url, notice: "Person successfully deleted"
|
37
|
+
else
|
38
|
+
redirect_to person, alert: person.errors.full_messages.join
|
39
|
+
end
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
## Error message customization
|
44
|
+
|
45
|
+
You can change the default base error message by setting the following key in your locale file(s):
|
46
|
+
|
47
|
+
```yaml
|
48
|
+
en:
|
49
|
+
prevent_destroy_if_any:
|
50
|
+
messages:
|
51
|
+
cannot_delete_parent_object: "Hey!!! You cannot delete %{parent_object} while %{associated_objects} exist"
|
52
|
+
```
|
42
53
|
|
43
|
-
License
|
44
|
-
---
|
54
|
+
## License
|
45
55
|
|
46
|
-
Copyright ©
|
56
|
+
Copyright © 2013 Florent Guilleux, released under the MIT license.
|
@@ -1,24 +1,31 @@
|
|
1
|
-
require
|
1
|
+
require 'prevent_destroy_if_any/version'
|
2
|
+
I18n.load_path += Dir[File.expand_path(File.dirname(__FILE__)) + "/../config/locales/*.yml"]
|
2
3
|
|
3
4
|
class ActiveRecord::Base
|
4
5
|
def self.prevent_destroy_if_any(*association_names)
|
5
6
|
before_destroy do |model|
|
6
|
-
|
7
|
-
|
7
|
+
available_associations = []
|
8
8
|
association_names.each do |association_name|
|
9
9
|
association = model.send association_name
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
unless association.blank?
|
11
|
+
available_associations << if association.is_a?(ActiveRecord::Associations::CollectionProxy)
|
12
|
+
association.first.class.model_name.human(:count => 2)
|
13
|
+
else
|
14
|
+
association.class.model_name.human
|
15
|
+
end.downcase
|
14
16
|
end
|
15
17
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
if available_associations.any?
|
19
|
+
errors.add(
|
20
|
+
:base,
|
21
|
+
I18n.t(
|
22
|
+
'prevent_destroy_if_any.messages.cannot_delete_parent_object',
|
23
|
+
:parent_object => model.class.model_name.human.downcase,
|
24
|
+
:associated_objects => available_associations.join(', ')
|
25
|
+
)
|
26
|
+
)
|
27
|
+
false
|
20
28
|
end
|
21
|
-
|
22
29
|
end
|
23
30
|
end
|
24
31
|
end
|
@@ -19,9 +19,10 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_dependency "activerecord", '>= 3.0.0'
|
22
|
+
s.add_dependency "i18n"
|
22
23
|
s.add_development_dependency "bundler", '>= 1.0.0'
|
23
24
|
s.add_development_dependency "rspec", '>= 0'
|
24
25
|
s.add_development_dependency "database_cleaner", '>= 0'
|
25
|
-
s.add_development_dependency "sqlite3
|
26
|
+
s.add_development_dependency "sqlite3", '>= 0'
|
26
27
|
s.add_development_dependency "rake", '>= 0'
|
27
28
|
end
|
@@ -9,33 +9,35 @@ describe "prevent_destroy_if_any" do
|
|
9
9
|
it "destroy preventing works for has_many association" do
|
10
10
|
person.projects.create
|
11
11
|
person.destroy
|
12
|
-
person.destroyed
|
12
|
+
expect(person.destroyed?).to be_falsey
|
13
13
|
end
|
14
14
|
|
15
15
|
it "destroy preventing works for has_one association" do
|
16
16
|
person.create_public_profile
|
17
17
|
person.destroy
|
18
|
-
person.destroyed
|
18
|
+
expect(person.destroyed?).to be_falsey
|
19
19
|
end
|
20
20
|
|
21
21
|
it "destroy preventing works for belongs_ association" do
|
22
22
|
person.create_user
|
23
23
|
person.destroy
|
24
|
-
person.destroyed
|
24
|
+
expect(person.destroyed?).to be_falsey
|
25
25
|
end
|
26
26
|
|
27
27
|
it "adds an error message" do
|
28
28
|
person.projects.create
|
29
29
|
person.create_public_profile
|
30
30
|
person.destroy
|
31
|
-
person.errors[:base].first.
|
31
|
+
expect(person.errors[:base].first).to eq I18n.t('prevent_destroy_if_any.messages.cannot_delete_parent_object',
|
32
|
+
:parent_object => 'person',
|
33
|
+
:associated_objects => 'project, public profile'
|
34
|
+
)
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
37
|
it "does not prevent the destroy if the association is not listed as preventing the destroy" do
|
36
38
|
person.logs.create
|
37
39
|
person.destroy
|
38
|
-
person.destroyed
|
40
|
+
expect(person.destroyed?).to be_truthy
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
@@ -43,7 +45,7 @@ describe "prevent_destroy_if_any" do
|
|
43
45
|
|
44
46
|
it "does not prevent the destroy" do
|
45
47
|
person.destroy
|
46
|
-
person.destroyed
|
48
|
+
expect(person.destroyed?).to be_truthy
|
47
49
|
end
|
48
50
|
|
49
51
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,7 +10,7 @@ require "database_cleaner"
|
|
10
10
|
require "prevent_destroy_if_any"
|
11
11
|
|
12
12
|
ActiveRecord::Base.configurations = { 'test' => { :adapter => 'sqlite3', :database => ':memory:' } }
|
13
|
-
ActiveRecord::Base.establish_connection(
|
13
|
+
ActiveRecord::Base.establish_connection(:test)
|
14
14
|
|
15
15
|
class Person < ActiveRecord::Base
|
16
16
|
belongs_to :user
|
@@ -37,7 +37,7 @@ class Log < ActiveRecord::Base
|
|
37
37
|
belongs_to :person
|
38
38
|
end
|
39
39
|
|
40
|
-
ActiveRecord::Base.silence do
|
40
|
+
ActiveRecord::Base.silence(:stdout) do
|
41
41
|
ActiveRecord::Migration.verbose = false
|
42
42
|
ActiveRecord::Schema.define :version => 0 do
|
43
43
|
create_table(:people) { |t| t.string :name; t.integer :user_id }
|
metadata
CHANGED
@@ -1,83 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prevent_destroy_if_any
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.2'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Florent Guilleux
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
default_executable:
|
11
|
+
date: 2014-11-05 00:00:00.000000000 Z
|
14
12
|
dependencies:
|
15
13
|
- !ruby/object:Gem::Dependency
|
16
14
|
name: activerecord
|
17
|
-
requirement:
|
18
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
19
16
|
requirements:
|
20
|
-
- -
|
17
|
+
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 3.0.0
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: i18n
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
26
41
|
- !ruby/object:Gem::Dependency
|
27
42
|
name: bundler
|
28
|
-
requirement:
|
29
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: 1.0.0
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
37
55
|
- !ruby/object:Gem::Dependency
|
38
56
|
name: rspec
|
39
|
-
requirement:
|
40
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
41
58
|
requirements:
|
42
|
-
- -
|
59
|
+
- - ">="
|
43
60
|
- !ruby/object:Gem::Version
|
44
61
|
version: '0'
|
45
62
|
type: :development
|
46
63
|
prerelease: false
|
47
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
48
69
|
- !ruby/object:Gem::Dependency
|
49
70
|
name: database_cleaner
|
50
|
-
requirement:
|
51
|
-
none: false
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
52
72
|
requirements:
|
53
|
-
- -
|
73
|
+
- - ">="
|
54
74
|
- !ruby/object:Gem::Version
|
55
75
|
version: '0'
|
56
76
|
type: :development
|
57
77
|
prerelease: false
|
58
|
-
version_requirements:
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
59
83
|
- !ruby/object:Gem::Dependency
|
60
|
-
name: sqlite3
|
61
|
-
requirement:
|
62
|
-
none: false
|
84
|
+
name: sqlite3
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
63
86
|
requirements:
|
64
|
-
- -
|
87
|
+
- - ">="
|
65
88
|
- !ruby/object:Gem::Version
|
66
89
|
version: '0'
|
67
90
|
type: :development
|
68
91
|
prerelease: false
|
69
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
70
97
|
- !ruby/object:Gem::Dependency
|
71
98
|
name: rake
|
72
|
-
requirement:
|
73
|
-
none: false
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
74
100
|
requirements:
|
75
|
-
- -
|
101
|
+
- - ">="
|
76
102
|
- !ruby/object:Gem::Version
|
77
103
|
version: '0'
|
78
104
|
type: :development
|
79
105
|
prerelease: false
|
80
|
-
version_requirements:
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
81
111
|
description: ActiveRecord plugin to prevent destroy when associations are present
|
82
112
|
email:
|
83
113
|
- florent2@gmail.com
|
@@ -85,46 +115,43 @@ executables: []
|
|
85
115
|
extensions: []
|
86
116
|
extra_rdoc_files: []
|
87
117
|
files:
|
88
|
-
- .gitignore
|
118
|
+
- ".gitignore"
|
119
|
+
- CHANGELOG.md
|
89
120
|
- Gemfile
|
90
121
|
- README.md
|
91
122
|
- Rakefile
|
123
|
+
- config/locales/en.yml
|
124
|
+
- config/locales/es.yml
|
125
|
+
- config/locales/fr.yml
|
92
126
|
- lib/prevent_destroy_if_any.rb
|
93
127
|
- lib/prevent_destroy_if_any/version.rb
|
94
128
|
- prevent_destroy_if_any.gemspec
|
95
129
|
- spec/prevent_destroy_if_any_spec.rb
|
96
130
|
- spec/spec_helper.rb
|
97
|
-
has_rdoc: true
|
98
131
|
homepage: https://github.com/Florent2/prevent_destroy_if_any
|
99
132
|
licenses: []
|
133
|
+
metadata: {}
|
100
134
|
post_install_message:
|
101
135
|
rdoc_options: []
|
102
136
|
require_paths:
|
103
137
|
- lib
|
104
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
139
|
requirements:
|
107
|
-
- -
|
140
|
+
- - ">="
|
108
141
|
- !ruby/object:Gem::Version
|
109
142
|
version: '0'
|
110
|
-
segments:
|
111
|
-
- 0
|
112
|
-
hash: 3762508194909461440
|
113
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
144
|
requirements:
|
116
|
-
- -
|
145
|
+
- - ">="
|
117
146
|
- !ruby/object:Gem::Version
|
118
147
|
version: '0'
|
119
|
-
segments:
|
120
|
-
- 0
|
121
|
-
hash: 3762508194909461440
|
122
148
|
requirements: []
|
123
149
|
rubyforge_project: prevent_destroy_if_any
|
124
|
-
rubygems_version:
|
150
|
+
rubygems_version: 2.2.2
|
125
151
|
signing_key:
|
126
|
-
specification_version:
|
152
|
+
specification_version: 4
|
127
153
|
summary: ActiveRecord plugin to prevent destroy when associations are present
|
128
154
|
test_files:
|
129
155
|
- spec/prevent_destroy_if_any_spec.rb
|
130
156
|
- spec/spec_helper.rb
|
157
|
+
has_rdoc:
|