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.
@@ -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
@@ -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 only with ActiveRecord 3.
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
- `gem install prevent_destroy_if_any`
11
+ Add this line to your application’s Gemfile:
14
12
 
15
- If you use Bundler, edit your `Gemfile` to add `gem 'prevent_destroy_if_any'`.
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
- class Person < ActiveRecord::Base
24
- belongs_to :user
25
- has_many :projects
26
- has_one :public_profile
27
- has_many :logs
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
- prevent_destroy_if_any :user, :projects, :public_profile
30
- end
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
- def destroy
35
- person = Person.find params[:id]
36
- if person.destroy
37
- redirect_to people_url, :notice => "Person successfully deleted"
38
- else
39
- redirect_to person, :alert => person.errors.full_messages.join
40
- end
41
- end
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 © 2011 Florent Guilleux, released under the MIT license.
56
+ Copyright © 2013 Florent Guilleux, released under the MIT license.
@@ -0,0 +1,4 @@
1
+ en:
2
+ prevent_destroy_if_any:
3
+ messages:
4
+ cannot_delete_parent_object: "Cannot delete %{parent_object} while %{associated_objects} exist"
@@ -0,0 +1,4 @@
1
+ es:
2
+ prevent_destroy_if_any:
3
+ messages:
4
+ cannot_delete_parent_object: "No se puede eliminar %{parent_object} mientras %{associated_objects} exista"
@@ -0,0 +1,4 @@
1
+ fr:
2
+ prevent_destroy_if_any:
3
+ messages:
4
+ cannot_delete_parent_object: "Suppression de %{parent_object} impossible car il y a %{associated_objects}"
@@ -1,24 +1,31 @@
1
- require "prevent_destroy_if_any/version"
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
- associations_present = []
7
-
7
+ available_associations = []
8
8
  association_names.each do |association_name|
9
9
  association = model.send association_name
10
- if association.class == Array
11
- associations_present << association_name if association.any?
12
- else
13
- associations_present << association_name if association
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
- if associations_present.any?
18
- errors.add :base, "Cannot delete #{model.class.model_name.human.downcase} while #{associations_present.join ', '} exist"
19
- return false
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
@@ -1,3 +1,3 @@
1
1
  module PreventDestroyIfAny
2
- VERSION = "0.1"
2
+ VERSION = "0.2"
3
3
  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-ruby", '>= 0'
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?.should be_false
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?.should be_false
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?.should be_false
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.should == "Cannot delete person while projects, public_profile exist"
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?.should be_true
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?.should be_true
48
+ expect(person.destroyed?).to be_truthy
47
49
  end
48
50
 
49
51
  end
@@ -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('test')
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.1'
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: 2011-08-07 00:00:00.000000000 -05:00
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: &2157972440 !ruby/object:Gem::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: *2157972440
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: &2157971360 !ruby/object:Gem::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: *2157971360
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: &2157970640 !ruby/object:Gem::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: *2157970640
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: &2157969820 !ruby/object:Gem::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: *2157969820
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-ruby
61
- requirement: &2157968200 !ruby/object:Gem::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: *2157968200
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: &2157709680 !ruby/object:Gem::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: *2157709680
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: 1.6.2
150
+ rubygems_version: 2.2.2
125
151
  signing_key:
126
- specification_version: 3
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: