scaffold_logic 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/.document +5 -0
  2. data/Capfile +4 -0
  3. data/README.rdoc +29 -0
  4. data/Rakefile +51 -0
  5. data/VERSION +1 -0
  6. data/config/deploy.rb +41 -0
  7. data/lib/generators/scaffold_logic/layout/USAGE +7 -0
  8. data/lib/generators/scaffold_logic/layout/layout_generator.rb +38 -0
  9. data/lib/generators/scaffold_logic/layout/templates/_nav_tabs.html.erb +3 -0
  10. data/lib/generators/scaffold_logic/layout/templates/images/icons/add.png +0 -0
  11. data/lib/generators/scaffold_logic/layout/templates/images/icons/collapsed.gif +0 -0
  12. data/lib/generators/scaffold_logic/layout/templates/images/icons/delete.png +0 -0
  13. data/lib/generators/scaffold_logic/layout/templates/images/icons/drag.png +0 -0
  14. data/lib/generators/scaffold_logic/layout/templates/images/icons/edit.png +0 -0
  15. data/lib/generators/scaffold_logic/layout/templates/images/icons/expanded.gif +0 -0
  16. data/lib/generators/scaffold_logic/layout/templates/images/icons/help_icon.png +0 -0
  17. data/lib/generators/scaffold_logic/layout/templates/images/icons/link_icon.png +0 -0
  18. data/lib/generators/scaffold_logic/layout/templates/images/icons/move.png +0 -0
  19. data/lib/generators/scaffold_logic/layout/templates/images/icons/move_white.png +0 -0
  20. data/lib/generators/scaffold_logic/layout/templates/images/icons/note.png +0 -0
  21. data/lib/generators/scaffold_logic/layout/templates/images/icons/note_white.png +0 -0
  22. data/lib/generators/scaffold_logic/layout/templates/images/icons/notification_icon_sprite.png +0 -0
  23. data/lib/generators/scaffold_logic/layout/templates/images/icons/spinner.gif +0 -0
  24. data/lib/generators/scaffold_logic/layout/templates/images/icons/view.png +0 -0
  25. data/lib/generators/scaffold_logic/layout/templates/images/icons/warning.png +0 -0
  26. data/lib/generators/scaffold_logic/layout/templates/images/icons/warning_2.png +0 -0
  27. data/lib/generators/scaffold_logic/layout/templates/images/icons/warning_box.png +0 -0
  28. data/lib/generators/scaffold_logic/layout/templates/images/icons/warning_icon.png +0 -0
  29. data/lib/generators/scaffold_logic/layout/templates/images/icons/warning_white.png +0 -0
  30. data/lib/generators/scaffold_logic/layout/templates/images/layout/arrow_asc.png +0 -0
  31. data/lib/generators/scaffold_logic/layout/templates/images/layout/arrow_desc.png +0 -0
  32. data/lib/generators/scaffold_logic/layout/templates/images/layout/back.png +0 -0
  33. data/lib/generators/scaffold_logic/layout/templates/images/layout/black_bar.png +0 -0
  34. data/lib/generators/scaffold_logic/layout/templates/images/layout/breadcrumb_bg.png +0 -0
  35. data/lib/generators/scaffold_logic/layout/templates/images/layout/button_bg.png +0 -0
  36. data/lib/generators/scaffold_logic/layout/templates/images/layout/content_left_bg.png +0 -0
  37. data/lib/generators/scaffold_logic/layout/templates/images/layout/content_right_bg.png +0 -0
  38. data/lib/generators/scaffold_logic/layout/templates/images/layout/credit_cards.gif +0 -0
  39. data/lib/generators/scaffold_logic/layout/templates/images/layout/footer_bg.png +0 -0
  40. data/lib/generators/scaffold_logic/layout/templates/images/layout/h1_bg.png +0 -0
  41. data/lib/generators/scaffold_logic/layout/templates/images/layout/h2_bg.png +0 -0
  42. data/lib/generators/scaffold_logic/layout/templates/images/layout/h2_bg_for_table.png +0 -0
  43. data/lib/generators/scaffold_logic/layout/templates/images/layout/header_bg_grey.png +0 -0
  44. data/lib/generators/scaffold_logic/layout/templates/images/layout/header_bg_purple.png +0 -0
  45. data/lib/generators/scaffold_logic/layout/templates/images/layout/legend_bg.png +0 -0
  46. data/lib/generators/scaffold_logic/layout/templates/images/layout/menu_box_bg.png +0 -0
  47. data/lib/generators/scaffold_logic/layout/templates/images/layout/shadow_border.png +0 -0
  48. data/lib/generators/scaffold_logic/layout/templates/images/layout/shadow_border_2.png +0 -0
  49. data/lib/generators/scaffold_logic/layout/templates/images/layout/shadow_border_3.png +0 -0
  50. data/lib/generators/scaffold_logic/layout/templates/images/layout/shadow_border_4.png +0 -0
  51. data/lib/generators/scaffold_logic/layout/templates/images/layout/tab.png +0 -0
  52. data/lib/generators/scaffold_logic/layout/templates/images/layout/tab_active.png +0 -0
  53. data/lib/generators/scaffold_logic/layout/templates/images/layout/table_header.png +0 -0
  54. data/lib/generators/scaffold_logic/layout/templates/images/layout/text_field_bg.jpg +0 -0
  55. data/lib/generators/scaffold_logic/layout/templates/images/layout/text_field_error_bg.png +0 -0
  56. data/lib/generators/scaffold_logic/layout/templates/images/layout/th_bg.png +0 -0
  57. data/lib/generators/scaffold_logic/layout/templates/images/layout/th_bg_selected.png +0 -0
  58. data/lib/generators/scaffold_logic/layout/templates/images/src/black_bar.psd +0 -0
  59. data/lib/generators/scaffold_logic/layout/templates/images/src/branding.psd +0 -0
  60. data/lib/generators/scaffold_logic/layout/templates/images/src/legend_bg.psd +0 -0
  61. data/lib/generators/scaffold_logic/layout/templates/images/src/menu_icons.psd +0 -0
  62. data/lib/generators/scaffold_logic/layout/templates/layout.html.erb +49 -0
  63. data/lib/generators/scaffold_logic/layout/templates/layout_helper.rb +16 -0
  64. data/lib/generators/scaffold_logic/layout/templates/stylesheets/application.css +881 -0
  65. data/lib/generators/scaffold_logic/layout/templates/stylesheets/core.css +1146 -0
  66. data/lib/generators/scaffold_logic/layout/templates/stylesheets/core_ie.css +52 -0
  67. data/lib/generators/scaffold_logic/layout/templates/stylesheets/csshover3.htc +14 -0
  68. data/lib/generators/scaffold_logic/scaffold/USAGE +48 -0
  69. data/lib/generators/scaffold_logic/scaffold/scaffold_generator.rb +230 -0
  70. data/lib/generators/scaffold_logic/scaffold/templates/actions/create.rb +9 -0
  71. data/lib/generators/scaffold_logic/scaffold/templates/actions/destroy.rb +6 -0
  72. data/lib/generators/scaffold_logic/scaffold/templates/actions/edit.rb +3 -0
  73. data/lib/generators/scaffold_logic/scaffold/templates/actions/index.rb +3 -0
  74. data/lib/generators/scaffold_logic/scaffold/templates/actions/new.rb +3 -0
  75. data/lib/generators/scaffold_logic/scaffold/templates/actions/show.rb +3 -0
  76. data/lib/generators/scaffold_logic/scaffold/templates/actions/update.rb +9 -0
  77. data/lib/generators/scaffold_logic/scaffold/templates/controller.rb +7 -0
  78. data/lib/generators/scaffold_logic/scaffold/templates/helper.rb +2 -0
  79. data/lib/generators/scaffold_logic/scaffold/templates/migration.rb +16 -0
  80. data/lib/generators/scaffold_logic/scaffold/templates/model.rb +18 -0
  81. data/lib/generators/scaffold_logic/scaffold/templates/mongoid_model.rb +30 -0
  82. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/create.rb +10 -0
  83. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/destroy.rb +5 -0
  84. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/edit.rb +4 -0
  85. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/index.rb +5 -0
  86. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/new.rb +4 -0
  87. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/show.rb +4 -0
  88. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/actions/update.rb +11 -0
  89. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/controller.rb +12 -0
  90. data/lib/generators/scaffold_logic/scaffold/templates/tests/rspec/model.rb +5 -0
  91. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/create.rb +13 -0
  92. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/destroy.rb +8 -0
  93. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/edit.rb +6 -0
  94. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/index.rb +6 -0
  95. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/new.rb +6 -0
  96. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/show.rb +6 -0
  97. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/actions/update.rb +13 -0
  98. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/controller.rb +5 -0
  99. data/lib/generators/scaffold_logic/scaffold/templates/tests/shoulda/model.rb +7 -0
  100. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/create.rb +11 -0
  101. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/destroy.rb +6 -0
  102. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/edit.rb +4 -0
  103. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/index.rb +4 -0
  104. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/new.rb +4 -0
  105. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/show.rb +4 -0
  106. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/actions/update.rb +11 -0
  107. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/controller.rb +5 -0
  108. data/lib/generators/scaffold_logic/scaffold/templates/tests/testunit/model.rb +7 -0
  109. data/lib/generators/scaffold_logic/scaffold/templates/views/erb/_form.html.erb +39 -0
  110. data/lib/generators/scaffold_logic/scaffold/templates/views/erb/edit.html.erb +5 -0
  111. data/lib/generators/scaffold_logic/scaffold/templates/views/erb/index.html.erb +32 -0
  112. data/lib/generators/scaffold_logic/scaffold/templates/views/erb/new.html.erb +5 -0
  113. data/lib/generators/scaffold_logic/scaffold/templates/views/erb/show.html.erb +22 -0
  114. data/lib/scaffold_logic.rb +198 -0
  115. data/lib/scaffold_logic/data_import.rb +80 -0
  116. data/lib/scaffold_logic/form_helper.rb +148 -0
  117. data/lib/scaffold_logic/helper.rb +174 -0
  118. data/lib/scaffold_logic/menu_helper.rb +27 -0
  119. data/lib/scaffold_logic/tab_interface_helper.rb +125 -0
  120. data/scaffold_logic.gemspec +154 -0
  121. metadata +184 -0
@@ -0,0 +1,52 @@
1
+ /* @group General IE Workarounds */
2
+
3
+ fieldset.form_container {
4
+ clear: both;
5
+ width: 96%;
6
+ z-index: 0;
7
+ }
8
+
9
+ legend {
10
+ display: none;
11
+ }
12
+
13
+ .faux_legend {
14
+ border: 1px solid #999999;
15
+ padding: .5em;
16
+ background-color: #79984c;
17
+ color: #ffffff;
18
+ margin-top: -2.5em;
19
+ margin-left: -1.4em;
20
+ width: 26.5em;
21
+ font-weight: bold;
22
+ font-size: .8em;
23
+ text-transform: uppercase;
24
+ padding-left: 1em;
25
+ }
26
+
27
+ /* @end */
28
+
29
+ /* @group IE6 Workarounds */
30
+
31
+ /* Add support for hover, for nav menu */
32
+ *html body {
33
+ behavior:url("/stylesheets/csshover3.htc");
34
+ }
35
+
36
+ * html fieldset.form_container {
37
+ width: 92%;
38
+ margin-top: 20px !important;
39
+ z-index: 0;
40
+ }
41
+
42
+ * html p {
43
+ margin-bottom: 1.5em;
44
+ }
45
+
46
+ * html .faux_legend {
47
+ margin-top: -12px;
48
+ }
49
+
50
+
51
+ /* @end */
52
+
@@ -0,0 +1,14 @@
1
+ <public:attach event="ondocumentready" onevent="CSSHover()" />
2
+ <script>
3
+ /**
4
+ * Whatever:hover - V3.00.081222
5
+ * --------------------------------------------------------
6
+ * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
7
+ * License - http://creativecommons.org/licenses/LGPL/2.1
8
+ * Packed - http://dean.edwards.name/packer
9
+ *
10
+ * howto: body { behavior:url("csshover3.htc"); }
11
+ */
12
+ eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('r.R=(8(){4 f=/(^|\\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(C|D|E))/i,S=/(.*?)\\:(C|D|E)/i,T=/[^:]+:([a-z-]+).*/i,U=/(\\.([a-V-W-]+):[a-z]+)|(:[a-z]+)/1c,X=/\\.([a-V-W-]*Y(C|D|E))/i,Z=/1d (5|6|7)/i,10=/1e/i;4 g=\'1f-\';4 h={p:[],t:{},11:8(){n(!Z.F(1g.1h)&&!10.F(r.12.1i))u;4 a=r.12.1j,l=a.v;w(4 i=0;i<l;i++){3.G(a[i])}},G:8(a){n(a.H){I{4 b=a.H,l=b.v;w(4 i=0;i<l;i++){3.G(a.H[i])}}J(13){}}I{4 c=a.1k,l=c.v;w(4 j=0;j<l;j++){3.14(c[j],a)}}J(13){}},14:8(a,b){4 c=a.1l;n(f.F(c)){4 d=a.K.1m,L=S.15(c)[1],M=c.N(T,\'Y$1\'),O=c.N(U,\'.$2\'+M),o=X.15(O)[1];4 e=L+o;n(!3.t[e]){b.16(L,g+o+\':1n(R(3, "\'+M+\'", "\'+o+\'"))\');3.t[e]=17}b.16(O,d)}},18:8(a,b,c){4 d=g+c;n(a.K[d]){a.K[d]=q}n(!a.x)a.x=[];n(!a.x[c]){a.x[c]=17;4 e=19 P(a,b,c);3.p.1o(e)}u b},y:8(){I{4 l=3.p.v;w(4 i=0;i<l;i++){3.p[i].y()}3.p=[];3.t={}}J(e){}}};r.Q(\'1p\',8(){h.y()});4 k={1q:{9:\'1r\',m:\'1s\'},1t:{9:\'1u\',m:\'1v\'},1a:{9:\'1a\',m:\'1w\'}};8 P(a,b,c){3.A=a;3.B=b;4 d=19 1x(\'(^|\\\\s)\'+c+\'(\\\\s|$)\',\'g\');3.9=8(){a.o+=\' \'+c};3.m=8(){a.o=a.o.N(d,\' \')};a.Q(k[b].9,3.9);a.Q(k[b].m,3.m)}P.1y={y:8(){3.A.1b(k[3.B].9,3.9);3.A.1b(k[3.B].m,3.m);3.9=q;3.m=q;3.A=q;3.B=q}};u 8(a,b,c){n(a){u h.18(a,b,c)}1z{h.11()}}})();',62,98,'|||this|var||||function|activator|||||||||||||deactivator|if|className|elements|null|window||callbacks|return|length|for|csshover|unload||node|type|hover|active|focus|test|parseStylesheet|imports|try|catch|style|affected|pseudo|replace|newSelect|CSSHoverElement|attachEvent|CSSHover|REG_AFFECTED|REG_PSEUDO|REG_SELECT|z0|9_|REG_CLASS|on|REG_MSIE|REG_COMPAT|init|document|securityException|parseCSSRule|exec|addRule|true|patch|new|onfocus|detachEvent|gi|msie|backcompat|csh|navigator|userAgent|compatMode|styleSheets|rules|selectorText|cssText|expression|push|onbeforeunload|onhover|onmouseenter|onmouseleave|onactive|onmousedown|onmouseup|onblur|RegExp|prototype|else'.split('|'),0,{}));
13
+
14
+ </script>
@@ -0,0 +1,48 @@
1
+ Description:
2
+ Scaffolds an entire resource, from model and migration to controller and
3
+ views. The resource is ready to use as a starting point for your restful,
4
+ resource-oriented application. Tests or specs are also generated depending
5
+ on if you have a "spec" directory or not.
6
+
7
+ Usage:
8
+ Pass the name of the model, either CamelCased or under_scored, as the first
9
+ argument along with an optional list of attribute pairs and controller actions.
10
+
11
+ If no controller actions are specified, they will default to index, show,
12
+ new, create, edit, update, and destroy.
13
+
14
+ IMPORTANT: If no attribute pairs are specified, no model will be generated.
15
+ It will try to determine the attributes from an existing model.
16
+
17
+ Attribute pairs are column_name:sql_type arguments specifying the
18
+ model's attributes. Timestamps are added by default, so you don't have to
19
+ specify them by hand as 'created_at:datetime updated_at:datetime'.
20
+
21
+ For example, `scaffold_logic:scaffold post name:string content:text hidden:boolean`
22
+ gives you a model with those three attributes, a controller that handles
23
+ the create/show/update/destroy, forms to create and edit your posts, and
24
+ an index that lists them all, as well as a map.resources :posts
25
+ declaration in config/routes.rb.
26
+
27
+ Adding an "!" in the mix of arguments will invert the passed controller
28
+ actions. This will include all 7 controller actitons except the ones
29
+ mentioned. This option doesn't affect model attributes.
30
+
31
+ Examples:
32
+ rails generate scaffold_logic:scaffold post
33
+
34
+ Will create a controller called "posts" it will contain all seven
35
+ CRUD actions along with the views. A model will NOT be created,
36
+ instead it will look for an existing model and use those attributes.
37
+
38
+ rails generate scaffold_logic:scaffold post name:string content:text index new edit
39
+
40
+ Will create a Post model and migration file with the name and content
41
+ attributes. It will also create a controller with index, new, create,
42
+ edit, and update actions. Notice the create and update actions are
43
+ added automatically with new and edit.
44
+
45
+ rails generate scaffold_logic:scaffold post ! show new
46
+
47
+ Creates a posts controller (no model) with index, edit, update, and
48
+ destroy actions.
@@ -0,0 +1,230 @@
1
+ require File.expand_path("../../../../scaffold_logic", __FILE__)
2
+ require 'rails/generators/migration'
3
+ require 'rails/generators/generated_attribute'
4
+
5
+ module ScaffoldLogic
6
+ module Generators
7
+ class ScaffoldGenerator < Rails::Generators::Base
8
+ include Rails::Generators::Migration
9
+ no_tasks { attr_accessor :model_name, :model_attributes, :controller_actions }
10
+
11
+ argument :model_name, :type => :string, :required => true, :banner => 'ModelName'
12
+ argument :args_for_c_m, :type => :array, :default => [], :banner => 'controller_actions and model:attributes'
13
+
14
+ class_option :skip_model, :desc => 'Don\'t generate a model or migration file.', :type => :boolean
15
+ class_option :skip_migration, :desc => 'Dont generate migration file for model.', :type => :boolean
16
+ class_option :skip_timestamps, :desc => 'Don\'t add timestamps to migration file.', :type => :boolean
17
+ class_option :skip_controller, :desc => 'Don\'t generate controller, helper, or views.', :type => :boolean
18
+ class_option :invert, :desc => 'Generate all controller actions except these mentioned.', :type => :boolean
19
+ class_option :haml, :desc => 'Generate HAML views instead of ERB.', :type => :boolean
20
+ class_option :mongoid, :desc => 'Use Mongoid for models instead of AR.', :type => :boolean
21
+ class_option :testunit, :desc => 'Use test/unit for test files.', :group => 'Test framework', :type => :boolean
22
+ class_option :rspec, :desc => 'Use RSpec for test files.', :group => 'Test framework', :type => :boolean
23
+ class_option :shoulda, :desc => 'Use shoulda for test files.', :group => 'Test framework', :type => :boolean
24
+
25
+ def initialize(*args, &block)
26
+ super
27
+
28
+ @controller_actions = []
29
+ @model_attributes = []
30
+ @skip_model = options.skip_model?
31
+ @invert_actions = options.invert?
32
+ @mongoid = options.mongoid
33
+
34
+ args_for_c_m.each do |arg|
35
+ if arg == '!'
36
+ @invert_actions = true
37
+ elsif arg.include?(':')
38
+ @model_attributes << Rails::Generators::GeneratedAttribute.new(*arg.split(':'))
39
+ else
40
+ @controller_actions << arg
41
+ @controller_actions << 'create' if arg == 'new'
42
+ @controller_actions << 'update' if arg == 'edit'
43
+ end
44
+ end
45
+
46
+ @controller_actions.uniq!
47
+ @model_attributes.uniq!
48
+
49
+ if @invert_actions || @controller_actions.empty?
50
+ @controller_actions = all_actions - @controller_actions
51
+ end
52
+
53
+ if @model_attributes.empty?
54
+ @skip_model = true # skip model if no attributes
55
+ if model_exists?
56
+ model_columns_for_attributes.each do |column|
57
+ @model_attributes << Rails::Generators::GeneratedAttribute.new(column.name.to_s, column.type.to_s)
58
+ end
59
+ else
60
+ @model_attributes << Rails::Generators::GeneratedAttribute.new('name', 'string')
61
+ end
62
+ end
63
+ end
64
+
65
+ def create_model
66
+ unless @skip_model
67
+ if @mongoid
68
+ template 'mongoid_model.rb', "app/models/#{singular_name}.rb"
69
+ else
70
+ template 'model.rb', "app/models/#{singular_name}.rb"
71
+ end
72
+ template "tests/rspec/model.rb", "spec/models/#{singular_name}_spec.rb"
73
+ end
74
+ end
75
+
76
+ def create_migration
77
+ unless @skip_model || options.skip_migration? || @mongoid
78
+ migration_template 'migration.rb', "db/migrate/create_#{plural_name}.rb"
79
+ end
80
+ end
81
+
82
+ def create_controller
83
+ unless options.skip_controller?
84
+ template 'controller.rb', "app/controllers/#{plural_name}_controller.rb"
85
+
86
+ controller_actions.each do |action|
87
+ if %w[index show new edit].include?(action) # Actions with templates
88
+ template "views/#{view_language}/#{action}.html.#{view_language}", "app/views/#{plural_name}/#{action}.html.#{view_language}"
89
+ end
90
+ end
91
+
92
+ if form_partial?
93
+ template "views/#{view_language}/_form.html.#{view_language}", "app/views/#{plural_name}/_form.html.#{view_language}"
94
+ end
95
+
96
+ route "resources #{plural_name.to_sym.inspect}"
97
+
98
+ template "tests/#{test_framework}/controller.rb", "spec/controllers/#{plural_name}_controller_spec.rb"
99
+ end
100
+ end
101
+
102
+ private
103
+
104
+ def form_partial?
105
+ actions? :new, :edit
106
+ end
107
+
108
+ def all_actions
109
+ %w[index show new create edit update destroy]
110
+ end
111
+
112
+ def action?(name)
113
+ controller_actions.include? name.to_s
114
+ end
115
+
116
+ def actions?(*names)
117
+ names.all? { |name| action? name }
118
+ end
119
+
120
+ def singular_name
121
+ model_name.underscore
122
+ end
123
+
124
+ def plural_name
125
+ model_name.underscore.pluralize
126
+ end
127
+
128
+ def class_name
129
+ model_name.camelize
130
+ end
131
+
132
+ def plural_class_name
133
+ plural_name.camelize
134
+ end
135
+
136
+ def controller_methods(dir_name)
137
+ controller_actions.map do |action|
138
+ read_template("#{dir_name}/#{action}.rb")
139
+ end.join("\n").strip
140
+ end
141
+
142
+ def render_form
143
+ if form_partial?
144
+ if options.haml?
145
+ "= render 'form'"
146
+ else
147
+ "<%= render 'form' %>"
148
+ end
149
+ else
150
+ read_template("views/#{view_language}/_form.html.#{view_language}")
151
+ end
152
+ end
153
+
154
+ def items_path(suffix = 'path')
155
+ if action? :index
156
+ "#{plural_name}_#{suffix}"
157
+ else
158
+ "root_#{suffix}"
159
+ end
160
+ end
161
+
162
+ def item_path(suffix = 'path')
163
+ if action? :show
164
+ "@#{singular_name}"
165
+ else
166
+ items_path(suffix)
167
+ end
168
+ end
169
+
170
+ def item_path_for_spec(suffix = 'path')
171
+ if action? :show
172
+ "#{singular_name}_#{suffix}(assigns[:#{singular_name}])"
173
+ else
174
+ items_path(suffix)
175
+ end
176
+ end
177
+
178
+ def item_path_for_test(suffix = 'path')
179
+ if action? :show
180
+ "#{singular_name}_#{suffix}(assigns(:#{singular_name}))"
181
+ else
182
+ items_path(suffix)
183
+ end
184
+ end
185
+
186
+ def model_columns_for_attributes
187
+ class_name.constantize.columns.reject do |column|
188
+ column.name.to_s =~ /^(id|created_at|updated_at)$/
189
+ end
190
+ end
191
+
192
+ def view_language
193
+ options.haml? ? 'haml' : 'erb'
194
+ end
195
+
196
+ def test_framework
197
+ return @test_framework if defined?(@test_framework)
198
+ return @test_framework = :rspec
199
+ end
200
+
201
+ def default_test_framework
202
+ :rspec
203
+ end
204
+
205
+ def model_exists?
206
+ File.exist? destination_path("app/models/#{singular_name}.rb")
207
+ end
208
+
209
+ def read_template(relative_path)
210
+ ERB.new(File.read(find_in_source_paths(relative_path)), nil, '-').result(binding)
211
+ end
212
+
213
+ def destination_path(path)
214
+ File.join(destination_root, path)
215
+ end
216
+
217
+ # FIXME: Should be proxied to ActiveRecord::Generators::Base
218
+ # Implement the required interface for Rails::Generators::Migration.
219
+ def self.next_migration_number(dirname) #:nodoc:
220
+ if ActiveRecord::Base.timestamped_migrations
221
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
222
+ else
223
+ "%.3d" % (current_migration_number(dirname) + 1)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ ScaffoldLogic::Generators::ScaffoldGenerator.source_root("#{Gem.searcher.find('scaffold_logic').full_gem_path}/lib/generators/scaffold_logic/scaffold/templates/")
@@ -0,0 +1,9 @@
1
+ def create
2
+ @<%= singular_name %> = <%= class_name %>.new(params[:<%= singular_name %>])
3
+ if @<%= singular_name %>.save
4
+ flash[:notice] = 'Successfully created <%= model_name.underscore.humanize.downcase %>.'
5
+ redirect_to <%= item_path('url') %>
6
+ else
7
+ render :action => 'new'
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ def destroy
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ @<%= singular_name %>.destroy
4
+ flash[:notice] = 'Successfully destroyed <%= model_name.underscore.humanize.downcase %>.'
5
+ redirect_to <%= items_path('url') %>
6
+ end
@@ -0,0 +1,3 @@
1
+ def edit
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ end
@@ -0,0 +1,3 @@
1
+ def index
2
+ @<%= plural_name %> = <%= class_name %>.order_by ScaffoldLogic.mongoid_sorter_from(params[:by], params[:dir])
3
+ end
@@ -0,0 +1,3 @@
1
+ def new
2
+ @<%= singular_name %> = <%= class_name %>.new
3
+ end
@@ -0,0 +1,3 @@
1
+ def show
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ end
@@ -0,0 +1,9 @@
1
+ def update
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ if @<%= singular_name %>.update_attributes(params[:<%= singular_name %>])
4
+ flash[:notice] = 'Successfully updated <%= model_name.underscore.humanize.downcase %>.'
5
+ redirect_to <%= item_path('url') %>
6
+ else
7
+ render :action => 'edit'
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ class <%= plural_class_name %>Controller < ApplicationController
2
+ before_filter :authenticate_user! if Object.const_defined?('Devise')
3
+ load_and_authorize_resource if Object.const_defined?('CanCan')
4
+
5
+ # CRUD ===========================================================================================
6
+ <%= controller_methods :actions %>
7
+ end
@@ -0,0 +1,2 @@
1
+ module <%= plural_class_name %>Helper
2
+ end
@@ -0,0 +1,16 @@
1
+ class Create<%= plural_class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= plural_name %> do |t|
4
+ <%- for attribute in model_attributes -%>
5
+ t.<%= attribute.type %> :<%= attribute.name %>
6
+ <%- end -%>
7
+ <%- unless options[:skip_timestamps] -%>
8
+ t.timestamps
9
+ <%- end -%>
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :<%= plural_name %>
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ # Constants ======================================================================================
3
+ SORTABLE_COLUMNS = ['id']
4
+
5
+ # Scopes =========================================================================================
6
+
7
+ # Relationships ==================================================================================
8
+
9
+ # Behavior =======================================================================================
10
+
11
+ # Callbacks ======================================================================================
12
+
13
+ # Validations ====================================================================================
14
+
15
+ # Class methods ==================================================================================
16
+
17
+ # Instance methods ===============================================================================
18
+ end