scaffold_plus 1.2.1 → 1.3.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 +4 -4
- data/README.md +10 -0
- data/lib/generators/scaffold_plus/has_many/has_many_generator.rb +4 -4
- data/lib/generators/scaffold_plus/many_to_many/many_to_many_generator.rb +110 -0
- data/lib/generators/scaffold_plus/many_to_many/templates/counter_migration.rb +5 -0
- data/lib/generators/scaffold_plus/many_to_many/templates/many_to_many_migration.rb +17 -0
- data/lib/generators/scaffold_plus/many_to_many/templates/many_to_many_model.rb +4 -0
- data/lib/scaffold_plus/version.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a08fcefd45e286fd8445802b84da15d435af04e8
|
4
|
+
data.tar.gz: 07646c0fcff9389f982d2b2b5c3972e43715bdae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bc399c4a5be223a17ec05c73d750831c2648ed236539aefa70a10c5d878c794eeb9cd2be86e54e184979f878b19ad8ef443121b71a93406007fbb850bda7fb6
|
7
|
+
data.tar.gz: 82b65abe4d9d91a9c5890949608fd822833129a57bd586d784461f95e751c525c82281f4c89ae86115f7c3ae4939b2d9a90f02daef0ce20a279bc18fde14294d
|
data/README.md
CHANGED
@@ -34,6 +34,16 @@ to a newly created resource route.
|
|
34
34
|
### Add ancestry to create a tree structure (or hierarchy)
|
35
35
|
rails generate scaffold_plus:ancestry
|
36
36
|
|
37
|
+
This helper adds has_ancestry to the model and updates the mass assignment
|
38
|
+
whitelist in the controller. It can also add a migration.
|
39
|
+
|
40
|
+
### Add many-to-many association with intermediate join table
|
41
|
+
rails generate scaffold_plus:many_to_many
|
42
|
+
|
43
|
+
This helper creates a join table and updates the two parent resources.
|
44
|
+
It can handle additional attributes in the join table incl. whitelisting
|
45
|
+
and accepts_nested_attributes_for in one of the parents.
|
46
|
+
|
37
47
|
## Testing
|
38
48
|
|
39
49
|
Since I have no experience with test driven development (yet), this is
|
@@ -41,9 +41,9 @@ module ScaffoldPlus
|
|
41
41
|
text = before_array.include?(name) ? "\n" : ""
|
42
42
|
text << " has_many :#{children}"
|
43
43
|
text << ", inverse_of: :#{name}" if options.inverse?
|
44
|
-
text << ", dependent: :#{dependent}" if options[:dependent]
|
44
|
+
text << ", dependent: :#{dependent}" if options[:dependent].present?
|
45
45
|
text << "\n"
|
46
|
-
text << " accepts_nested_attributes_for :#{children}\n" if options[:nested]
|
46
|
+
text << " accepts_nested_attributes_for :#{children}\n" if options[:nested].present?
|
47
47
|
text << "\n" if after_array.include?(name)
|
48
48
|
text
|
49
49
|
end
|
@@ -61,7 +61,7 @@ module ScaffoldPlus
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def add_to_permit
|
64
|
-
return unless options[:nested]
|
64
|
+
return unless options[:nested].present?
|
65
65
|
list = options[:nested].map{|n| ":#{n}"}.join(', ')
|
66
66
|
text = "#{children}_attributes: [ #{list} ]"
|
67
67
|
file = "app/controllers/#{table_name}_controller.rb"
|
@@ -81,7 +81,7 @@ module ScaffoldPlus
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def dependent
|
84
|
-
if options[:dependent] && options[:dependent] == "restrict"
|
84
|
+
if options[:dependent].present? && options[:dependent] == "restrict"
|
85
85
|
"restrict_with_exception"
|
86
86
|
else
|
87
87
|
options[:dependent]
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module ScaffoldPlus
|
4
|
+
module Generators
|
5
|
+
class ManyToManyGenerator < ActiveRecord::Generators::Base
|
6
|
+
desc "Add many-to-many association with intermediate join table"
|
7
|
+
argument :name, type: :string,
|
8
|
+
desc: "The name of the intermediate table"
|
9
|
+
argument :one, type: :string,
|
10
|
+
desc: "The first object that has_many TWO objects through NAME"
|
11
|
+
argument :two, type: :string,
|
12
|
+
desc: "The second object that has_many ONE objects through NAME"
|
13
|
+
class_option :attributes, type: :array, banner: 'name:type [...]',
|
14
|
+
desc: 'Additional attributes for the join table'
|
15
|
+
class_option :dependent, type: :string, banner: 'ACTION',
|
16
|
+
desc: 'Can be destroy, delete, or restrict'
|
17
|
+
class_option :nested, type: :array, banner: 'attribute [...]',
|
18
|
+
desc: 'Add accepts_nested_attributes_for to ONE incl. whitelisting'
|
19
|
+
class_option :counter, type: :boolean, default: false,
|
20
|
+
desc: 'Add counter_cache to ONE (and only to ONE)'
|
21
|
+
class_option :before, type: :array,
|
22
|
+
desc: 'Add a line before generated text in models'
|
23
|
+
class_option :after, type: :array,
|
24
|
+
desc: 'Add a line after generated text in models'
|
25
|
+
class_option :migration, type: :boolean, default: true,
|
26
|
+
desc: 'Create a migration for the join table'
|
27
|
+
class_option :index, type: :boolean, default: true,
|
28
|
+
desc: 'Add an index to the migration'
|
29
|
+
source_root File.expand_path('../templates', __FILE__)
|
30
|
+
|
31
|
+
def add_migration
|
32
|
+
return unless options.migration?
|
33
|
+
migration_template 'many_to_many_migration.rb', "db/migrate/#{migration_name}.rb"
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_counter
|
37
|
+
return unless options.counter?
|
38
|
+
migration_template 'counter_migration.rb', "db/migrate/#{counter_migration}.rb"
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_to_models
|
42
|
+
[[one, two], [two, one]].each do |pair|
|
43
|
+
current, partner = pair
|
44
|
+
inject_into_class "app/models/#{current}.rb", current.camelize do
|
45
|
+
text = before_array.include?(current) ? "\n" : ""
|
46
|
+
text << " has_many :#{table_name}"
|
47
|
+
text << ", dependent: :#{dependent}" if options[:dependent].present?
|
48
|
+
text << "\n"
|
49
|
+
text << " has_many :#{partner.pluralize}, through: :#{table_name}\n"
|
50
|
+
if current == one
|
51
|
+
text << " accepts_nested_attributes_for :#{table_name}\n" if options[:nested].present?
|
52
|
+
end
|
53
|
+
text << "\n" if after_array.include?(current)
|
54
|
+
text
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
template 'many_to_many_model.rb', "app/models/#{name}.rb"
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_to_permit
|
62
|
+
return unless options[:nested].present?
|
63
|
+
list = options[:nested].map{|n| ":#{n}"}.join(', ')
|
64
|
+
text = "#{table_name}_attributes: [ #{list} ]"
|
65
|
+
file = "app/controllers/#{one.pluralize}_controller.rb"
|
66
|
+
gsub_file file, /(permit\(.*)\)/, "\\1, #{text})"
|
67
|
+
# Special case: no previous permit
|
68
|
+
gsub_file file, /^(\s*params)\[:#{name}\]$/, "\\1.require(:#{name}).permit(#{text})"
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
|
73
|
+
def before_array
|
74
|
+
options['before'] || []
|
75
|
+
end
|
76
|
+
|
77
|
+
def after_array
|
78
|
+
options['after'] || []
|
79
|
+
end
|
80
|
+
|
81
|
+
def dependent
|
82
|
+
if options[:dependent].present? && options[:dependent] == "restrict"
|
83
|
+
"restrict_with_exception"
|
84
|
+
else
|
85
|
+
options[:dependent]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def migration_name
|
90
|
+
"create_#{table_name}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_index?
|
94
|
+
options.index?
|
95
|
+
end
|
96
|
+
|
97
|
+
def counter_migration
|
98
|
+
"add_#{table_name}_count_to_#{one}"
|
99
|
+
end
|
100
|
+
|
101
|
+
def counter_cache
|
102
|
+
options.counter? ? ", counter_cache: true" : ""
|
103
|
+
end
|
104
|
+
|
105
|
+
def attributes
|
106
|
+
options[:attributes] || []
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class <%= migration_name.camelize %> < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :<%= table_name %> do |t|
|
4
|
+
t.belongs_to :<%= one %>
|
5
|
+
t.belongs_to :<%= two %>
|
6
|
+
<%- attributes.each do |attribute| -%>
|
7
|
+
t.<%= attribute.split(':').second %> :<%= attribute.split(':').first %>
|
8
|
+
<%- end -%>
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
<%- if create_index? -%>
|
13
|
+
add_index :<%= table_name %>, :<%= one %>_id
|
14
|
+
add_index :<%= table_name %>, :<%= two %>_id
|
15
|
+
<%- end -%>
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaffold_plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Volker Wiegand
|
@@ -86,6 +86,10 @@ files:
|
|
86
86
|
- lib/generators/scaffold_plus/has_many/has_many_generator.rb
|
87
87
|
- lib/generators/scaffold_plus/has_many/templates/child_migration.rb
|
88
88
|
- lib/generators/scaffold_plus/has_many/templates/counter_migration.rb
|
89
|
+
- lib/generators/scaffold_plus/many_to_many/many_to_many_generator.rb
|
90
|
+
- lib/generators/scaffold_plus/many_to_many/templates/counter_migration.rb
|
91
|
+
- lib/generators/scaffold_plus/many_to_many/templates/many_to_many_migration.rb
|
92
|
+
- lib/generators/scaffold_plus/many_to_many/templates/many_to_many_model.rb
|
89
93
|
- lib/scaffold_plus.rb
|
90
94
|
- lib/scaffold_plus/version.rb
|
91
95
|
- scaffold_plus.gemspec
|