prevent_destroy_if_any 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: