ez 0.0.2 → 0.0.3
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/lib/ez/version.rb +1 -1
- data/lib/generators/ez/resource/USAGE +35 -0
- data/lib/generators/ez/resource/migration.rb +15 -0
- data/lib/generators/ez/resource/resource_generator.rb +143 -0
- data/lib/generators/ez/resource/templates/bootstrapped/edit.html.erb +26 -0
- data/lib/generators/ez/resource/templates/bootstrapped/index.html.erb +42 -0
- data/lib/generators/ez/resource/templates/bootstrapped/new.html.erb +26 -0
- data/lib/generators/ez/resource/templates/bootstrapped/show.html.erb +11 -0
- data/lib/generators/ez/resource/templates/controller.rb +70 -0
- data/lib/generators/ez/resource/templates/dried/_form.html.erb +13 -0
- data/lib/generators/ez/resource/templates/dried/bootstrapped/_form.html.erb +21 -0
- data/lib/generators/ez/resource/templates/dried/bootstrapped/edit.html.erb +5 -0
- data/lib/generators/ez/resource/templates/dried/bootstrapped/index.html.erb +42 -0
- data/lib/generators/ez/resource/templates/dried/bootstrapped/new.html.erb +5 -0
- data/lib/generators/ez/resource/templates/dried/bootstrapped/show.html.erb +11 -0
- data/lib/generators/ez/resource/templates/dried/controller.rb +72 -0
- data/lib/generators/ez/resource/templates/dried/edit.html.erb +3 -0
- data/lib/generators/ez/resource/templates/dried/index.html.erb +40 -0
- data/lib/generators/ez/resource/templates/dried/new.html.erb +3 -0
- data/lib/generators/ez/resource/templates/dried/show.html.erb +9 -0
- data/lib/generators/ez/resource/templates/edit.html.erb +24 -0
- data/lib/generators/ez/resource/templates/index.html.erb +40 -0
- data/lib/generators/ez/resource/templates/migration.rb +15 -0
- data/lib/generators/ez/resource/templates/model.rb +2 -0
- data/lib/generators/ez/resource/templates/new.html.erb +22 -0
- data/lib/generators/ez/resource/templates/show.html.erb +9 -0
- data/lib/generators/ez/style/USAGE +31 -0
- data/lib/generators/ez/style/style_generator.rb +34 -0
- data/lib/generators/ez/style/templates/layout.html.erb +66 -0
- data/lib/generators/ez/user/templates/user_controller.rb +68 -0
- data/lib/generators/ez/user/user_generator.rb +91 -0
- data/lib/generators/ez/views/USAGE +33 -0
- data/lib/tasks/ez_tasks.rake +24 -17
- metadata +33 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c352179b9a780759c9e923d23de75f162cd94af7
|
|
4
|
+
data.tar.gz: b470479273475d5b1d97f5fb392c237faebb54ea
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 67d6a3bbad1b7a2165fbe01f1995117a96c418eb4ac8d74e4016aad8df73df0588ae34554ae961cdc77c5b6ebd603606c202ec16bc7d489512debf9578293dc2
|
|
7
|
+
data.tar.gz: c40c452e34c92c013b90a3c18fecc466334ab2044ef4db1a6cbbc40492763e45249011d129647dcd60978fac0370e6b5c2dbae4c102bfd555fdba2bc725cf5e2
|
data/lib/ez/version.rb
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Generates an example of one entire database-backed resource, from model
|
|
3
|
+
and migration to controller and views. The resource is ready to use as a
|
|
4
|
+
starting point for your RESTful, resource-oriented application.
|
|
5
|
+
|
|
6
|
+
Pass the name of the model (in singular form), either CamelCased or
|
|
7
|
+
under_scored, as the first argument, and an optional list of attribute
|
|
8
|
+
pairs.
|
|
9
|
+
|
|
10
|
+
Attributes are field arguments specifying the model's attributes. You can
|
|
11
|
+
optionally pass the type and an index to each field. For instance:
|
|
12
|
+
"title body:text tracking_id:integer:uniq" will generate a title field of
|
|
13
|
+
string type, a body with text type and a tracking_id as an integer with an
|
|
14
|
+
unique index. "index" could also be given instead of "uniq" if one desires
|
|
15
|
+
a non unique index.
|
|
16
|
+
|
|
17
|
+
Timestamps are added by default, so you don't have to specify them by hand
|
|
18
|
+
as 'created_at:datetime updated_at:datetime'.
|
|
19
|
+
|
|
20
|
+
You don't have to think up every attribute up front, but it helps to
|
|
21
|
+
sketch out a few so you can start working with the resource immediately.
|
|
22
|
+
|
|
23
|
+
For example, 'starter:resource post title body:text published:boolean' gives
|
|
24
|
+
you a model with those three attributes, a controller that handles
|
|
25
|
+
the create/show/update/destroy, forms to create and edit your posts, and
|
|
26
|
+
an index that lists them all, as well as the Golden Seven "RESTful" routes
|
|
27
|
+
in config/routes.rb.
|
|
28
|
+
|
|
29
|
+
If you want to remove all the generated files, first rollback your migration
|
|
30
|
+
with 'rake db:rollback' if you've already run 'rake db:migrate'. Then run
|
|
31
|
+
'rails destroy starter:resource ModelName'.
|
|
32
|
+
|
|
33
|
+
Examples:
|
|
34
|
+
`rails generate starter:resource post title body:text published:boolean`
|
|
35
|
+
`rails generate starter:resource purchase amount:decimal tracking_id:integer:uniq`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module Generators
|
|
3
|
+
module Migration
|
|
4
|
+
# Implement the required interface for Rails::Generators::Migration.
|
|
5
|
+
def next_migration_number(dirname) #:nodoc:
|
|
6
|
+
next_migration_number = current_migration_number(dirname) + 1
|
|
7
|
+
if ActiveRecord::Base.timestamped_migrations
|
|
8
|
+
[Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % next_migration_number].max
|
|
9
|
+
else
|
|
10
|
+
"%.3d" % next_migration_number
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require 'rails/generators/active_record'
|
|
2
|
+
require_relative './migration'
|
|
3
|
+
module Starter
|
|
4
|
+
class ResourceGenerator < Rails::Generators::NamedBase
|
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
6
|
+
include Rails::Generators::ResourceHelpers
|
|
7
|
+
include Rails::Generators::Migration
|
|
8
|
+
extend ActiveRecord::Generators::Migration
|
|
9
|
+
|
|
10
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
|
11
|
+
remove_class_option :old_style_hash
|
|
12
|
+
remove_class_option :force_plural
|
|
13
|
+
remove_class_option :skip_namespace
|
|
14
|
+
class_option :named_routes, :type => :boolean, :default => true
|
|
15
|
+
class_option :skip_model, :type => :boolean, :default => false
|
|
16
|
+
class_option :skip_controller, :type => :boolean, :default => false
|
|
17
|
+
class_option :styled, :type => :boolean, :default => false, desc: 'Generates bootstrap-ready view templates'
|
|
18
|
+
class_option :dry, :type => :boolean, :default => false, desc: 'DRYs up the controller, views, and routes'
|
|
19
|
+
|
|
20
|
+
def generate_controller
|
|
21
|
+
return if options[:skip_controller]
|
|
22
|
+
if dry?
|
|
23
|
+
template 'dried/controller.rb', "app/controllers/#{plural_name.underscore}_controller.rb"
|
|
24
|
+
else
|
|
25
|
+
template 'controller.rb', "app/controllers/#{plural_name.underscore}_controller.rb"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def generate_model
|
|
30
|
+
return if options[:skip_model]
|
|
31
|
+
template 'model.rb', "app/models/#{singular_name.underscore}.rb"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def generate_migration
|
|
35
|
+
return if options[:skip_model]
|
|
36
|
+
migration_template "migration.rb", "db/migrate/create_#{table_name}.rb"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# def create_root_view_folder
|
|
40
|
+
# empty_directory File.join("app/views", controller_file_path)
|
|
41
|
+
# end
|
|
42
|
+
|
|
43
|
+
def copy_view_files
|
|
44
|
+
available_views.each do |view|
|
|
45
|
+
filename = view_filename_with_extensions(view)
|
|
46
|
+
template filename, File.join("app/views", controller_file_path, File.basename(filename))
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def generate_routes
|
|
52
|
+
return if options[:skip_controller]
|
|
53
|
+
if dry?
|
|
54
|
+
route "resources :#{plural_name}", "Named RESTful routes"
|
|
55
|
+
elsif named_routes?
|
|
56
|
+
route golden_7_named, "Named RESTful routes"
|
|
57
|
+
else
|
|
58
|
+
route golden_7, "RESTful routes"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
protected
|
|
63
|
+
|
|
64
|
+
def golden_7
|
|
65
|
+
["# Routes for the #{singular_name.capitalize} resource:",
|
|
66
|
+
" # CREATE",
|
|
67
|
+
" get '/#{plural_name}/new', controller: '#{plural_name}', action: 'new'",
|
|
68
|
+
" post '/#{plural_name}', controller: '#{plural_name}', action: 'create'",
|
|
69
|
+
"",
|
|
70
|
+
" # READ",
|
|
71
|
+
" get '/#{plural_name}', controller: '#{plural_name}', action: 'index'",
|
|
72
|
+
" get '/#{plural_name}/:id', controller: '#{plural_name}', action: 'show'",
|
|
73
|
+
"",
|
|
74
|
+
" # UPDATE",
|
|
75
|
+
" get '/#{plural_name}/:id/edit', controller: '#{plural_name}', action: 'edit'",
|
|
76
|
+
" patch '/#{plural_name}/:id', controller: '#{plural_name}', action: 'update'",
|
|
77
|
+
"",
|
|
78
|
+
" # DELETE",
|
|
79
|
+
" delete '/#{plural_name}/:id', controller: '#{plural_name}', action: 'destroy'",
|
|
80
|
+
" ##{'-' * 30}"
|
|
81
|
+
].join("\n")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def golden_7_named
|
|
85
|
+
["# Routes for the #{singular_name.capitalize} resource:",
|
|
86
|
+
" # CREATE",
|
|
87
|
+
" get '/#{plural_name}/new', controller: '#{plural_name}', action: 'new', as: 'new_#{singular_name}'",
|
|
88
|
+
" post '/#{plural_name}', controller: '#{plural_name}', action: 'create', as: '#{plural_name}'",
|
|
89
|
+
"",
|
|
90
|
+
" # READ",
|
|
91
|
+
" get '/#{plural_name}', controller: '#{plural_name}', action: 'index'",
|
|
92
|
+
" get '/#{plural_name}/:id', controller: '#{plural_name}', action: 'show', as: '#{singular_name}'",
|
|
93
|
+
"",
|
|
94
|
+
" # UPDATE",
|
|
95
|
+
" get '/#{plural_name}/:id/edit', controller: '#{plural_name}', action: 'edit', as: 'edit_#{singular_name}'",
|
|
96
|
+
" patch '/#{plural_name}/:id', controller: '#{plural_name}', action: 'update'",
|
|
97
|
+
"",
|
|
98
|
+
" # DELETE",
|
|
99
|
+
" delete '/#{plural_name}/:id', controller: '#{plural_name}', action: 'destroy'",
|
|
100
|
+
" ##{'-' * 30}"
|
|
101
|
+
].join("\n")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def dry?
|
|
105
|
+
options[:dry]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def named_routes?
|
|
109
|
+
options[:named_routes]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def styled?
|
|
113
|
+
options[:styled]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Override of Rails::Generators::Actions
|
|
117
|
+
def route(routing_code, title)
|
|
118
|
+
log :route, title
|
|
119
|
+
sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
|
|
120
|
+
|
|
121
|
+
in_root do
|
|
122
|
+
inject_into_file 'config/routes.rb', "\n #{routing_code}\n", { :after => sentinel, :verbose => false }
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def attributes_with_index
|
|
127
|
+
attributes.select { |a| a.has_index? || (a.reference? && options[:indexes]) }
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def available_views
|
|
131
|
+
dry? ? %w(index new edit show _form) : %w(index new edit show)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def view_filename_with_extensions(name)
|
|
135
|
+
filename = [name, :html, :erb].compact.join(".")
|
|
136
|
+
folders = []
|
|
137
|
+
folders << 'dried' if dry?
|
|
138
|
+
folders << 'bootstrapped' if styled?
|
|
139
|
+
filename = File.join(folders, filename) if folders.any?
|
|
140
|
+
return filename
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<div class="page-header">
|
|
2
|
+
<h1>Editing <%= human_name.titleize %> #<%%= @<%= singular_table_name %>.id %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<%%= form_tag(<%= singular_table_name %>_url(@<%= singular_table_name %>), method: 'patch', class: 'form-horizontal') do %>
|
|
6
|
+
<% attributes.each do |attribute| -%>
|
|
7
|
+
<div class="form-group">
|
|
8
|
+
<%%= label_tag :<%= attribute.name %>, nil, class: 'col-md-2 control-label' %>
|
|
9
|
+
<div class="col-md-6">
|
|
10
|
+
<% if attribute.field_type == :date_select || attribute.field_type == :time_select || attribute.field_type == :datetime_select -%>
|
|
11
|
+
<%%= text_field_tag :<%= attribute.name %>, @<%= singular_table_name %>.<%= attribute.name %>, class: 'form-control' %>
|
|
12
|
+
<% elsif attribute.field_type == :check_box -%>
|
|
13
|
+
<%%= check_box_tag :<%= attribute.name %>, 1, @<%= singular_table_name %>.<%= attribute.name %>? %>
|
|
14
|
+
<% else -%>
|
|
15
|
+
<%%= <%= attribute.field_type %>_tag :<%= attribute.name %>, @<%= singular_table_name %>.<%= attribute.name %>, class: 'form-control' %>
|
|
16
|
+
<% end -%>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<% end -%>
|
|
21
|
+
<div class="form-group">
|
|
22
|
+
<div class="col-md-offset-2 col-md-6">
|
|
23
|
+
<%%= submit_tag "Update <%= human_name.titleize %>", class: 'btn btn-primary' %>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<%% end %>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<div class="page-header">
|
|
2
|
+
<h1><%= plural_table_name.humanize %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<% if named_routes? -%>
|
|
6
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', new_<%= singular_table_name %>_url, class: 'btn btn-primary' %></p>
|
|
7
|
+
<% else -%>
|
|
8
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', "/<%= plural_name %>/new", class: 'btn btn-primary' %></p>
|
|
9
|
+
<% end -%>
|
|
10
|
+
|
|
11
|
+
<table class="table table-hover">
|
|
12
|
+
<thead>
|
|
13
|
+
<tr>
|
|
14
|
+
<% attributes.each do |attribute| -%>
|
|
15
|
+
<th><%= attribute.human_name %></th>
|
|
16
|
+
<% end -%>
|
|
17
|
+
<th></th>
|
|
18
|
+
<th></th>
|
|
19
|
+
<th></th>
|
|
20
|
+
</tr>
|
|
21
|
+
</thead>
|
|
22
|
+
|
|
23
|
+
<tbody>
|
|
24
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
|
25
|
+
<tr>
|
|
26
|
+
<% attributes.each do |attribute| -%>
|
|
27
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %><%= "?" if attribute.type == :boolean %> %></td>
|
|
28
|
+
<% end -%>
|
|
29
|
+
<% if named_routes? -%>
|
|
30
|
+
<td><%%= link_to '<i class="fa fa-search-plus"></i>'.html_safe, <%= singular_table_name %>_url(<%= singular_table_name %>), class: 'btn btn-primary' %></td>
|
|
31
|
+
<td><%%= link_to '<i class="fa fa-edit"></i>'.html_safe, edit_<%= singular_table_name %>_url(<%= singular_table_name %>), class: 'btn btn-warning' %></td>
|
|
32
|
+
<td><%%= link_to '<i class="fa fa-trash-o"></i>'.html_safe, <%= singular_table_name %>_url(<%= singular_table_name %>), method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" }, class: 'btn btn-danger' %></td>
|
|
33
|
+
<% else -%>
|
|
34
|
+
<td><%%= link_to '<i class="fa fa-search-plus"></i>'.html_safe, "/<%= plural_name %>/#{<%= singular_table_name %>.id}", class: 'btn btn-primary' %></td>
|
|
35
|
+
<td><%%= link_to '<i class="fa fa-edit"></i>'.html_safe, "/<%= plural_name %>/#{<%= singular_table_name %>.id}/edit", class: 'btn btn-warning' %></td>
|
|
36
|
+
<td><%%= link_to '<i class="fa fa-trash-o"></i>'.html_safe, "/<%= plural_name %>/#{<%= singular_table_name %>.id}", method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" }, class: 'btn btn-danger' %></td>
|
|
37
|
+
<% end -%>
|
|
38
|
+
</tr>
|
|
39
|
+
<%% end %>
|
|
40
|
+
</tbody>
|
|
41
|
+
</table>
|
|
42
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<div class="page-header">
|
|
2
|
+
<h1>New <%= human_name.titleize %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<%%= form_tag(<%= plural_name %>_url, method: 'post', class: 'form-horizontal') do %>
|
|
6
|
+
<% attributes.each do |attribute| -%>
|
|
7
|
+
<div class="form-group">
|
|
8
|
+
<%%= label_tag :<%= attribute.name %>, nil, class: 'col-md-2 control-label' %>
|
|
9
|
+
<div class="col-md-6">
|
|
10
|
+
<% if attribute.field_type == :date_select || attribute.field_type == :time_select || attribute.field_type == :datetime_select -%>
|
|
11
|
+
<%%= text_field_tag :<%= attribute.name %>, nil, class: 'form-control' %>
|
|
12
|
+
<% elsif attribute.field_type == :check_box -%>
|
|
13
|
+
<%%= check_box_tag :<%= attribute.name %> %>
|
|
14
|
+
<% else -%>
|
|
15
|
+
<%%= <%= attribute.field_type %>_tag :<%= attribute.name %>, nil, class: 'form-control' %>
|
|
16
|
+
<% end -%>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<% end -%>
|
|
21
|
+
<div class="form-group">
|
|
22
|
+
<div class="col-md-offset-2 col-md-6">
|
|
23
|
+
<%%= submit_tag "Create <%= human_name.titleize %>", class: 'btn btn-primary' %>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<%% end %>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<div class="page-header">
|
|
2
|
+
<h1><%= human_name.titleize %> #<%%= @<%= singular_table_name %>.id %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<dl class="dl-horizontal">
|
|
6
|
+
<% attributes.each do |attribute| -%>
|
|
7
|
+
<dt><%= attribute.human_name %></dt>
|
|
8
|
+
<dd><%%= @<%= singular_table_name %>.<%= attribute.name %><%= "?" if attribute.type == :boolean %> %></dd>
|
|
9
|
+
|
|
10
|
+
<% end -%>
|
|
11
|
+
</dl>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
class <%= plural_name.camelize %>Controller < ApplicationController
|
|
2
|
+
|
|
3
|
+
def index
|
|
4
|
+
@<%= plural_name.underscore %> = <%= class_name %>.all
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def show
|
|
8
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def new
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def create
|
|
15
|
+
@<%= singular_name.underscore %> = <%= class_name %>.new
|
|
16
|
+
<% attributes.each do |attribute| -%>
|
|
17
|
+
@<%= singular_name.underscore %>.<%= attribute.name %> = params[:<%= attribute.name %>]
|
|
18
|
+
<% end -%>
|
|
19
|
+
|
|
20
|
+
<% if named_routes? -%>
|
|
21
|
+
if @<%= singular_name.underscore %>.save
|
|
22
|
+
redirect_to <%= plural_name %>_url, notice: "<%= singular_name.humanize %> created successfully."
|
|
23
|
+
else
|
|
24
|
+
render 'new'
|
|
25
|
+
end
|
|
26
|
+
<% else -%>
|
|
27
|
+
if @<%= singular_name.underscore %>.save
|
|
28
|
+
redirect_to "/<%= plural_name %>", notice: "<%= singular_name.humanize %> created successfully."
|
|
29
|
+
else
|
|
30
|
+
render 'new'
|
|
31
|
+
end
|
|
32
|
+
<% end -%>
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def edit
|
|
36
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def update
|
|
40
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
41
|
+
<% attributes.each do |attribute| -%>
|
|
42
|
+
@<%= singular_name.underscore %>.<%= attribute.name %> = params[:<%= attribute.name %>]
|
|
43
|
+
<% end -%>
|
|
44
|
+
|
|
45
|
+
<% if named_routes? -%>
|
|
46
|
+
if @<%= singular_name.underscore %>.save
|
|
47
|
+
redirect_to <%= plural_name %>_url, notice: "<%= singular_name.humanize %> updated successfully."
|
|
48
|
+
else
|
|
49
|
+
render 'edit'
|
|
50
|
+
end
|
|
51
|
+
<% else -%>
|
|
52
|
+
if @<%= singular_name.underscore %>.save
|
|
53
|
+
redirect_to "/<%= plural_name %>", notice: "<%= singular_name.humanize %> updated successfully."
|
|
54
|
+
else
|
|
55
|
+
render 'edit'
|
|
56
|
+
end
|
|
57
|
+
<% end -%>
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def destroy
|
|
61
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
62
|
+
@<%= singular_name.underscore %>.destroy
|
|
63
|
+
|
|
64
|
+
<% if named_routes? -%>
|
|
65
|
+
redirect_to <%= plural_name %>_url, notice: "<%= singular_name.humanize %> deleted."
|
|
66
|
+
<% else -%>
|
|
67
|
+
redirect_to "/<%= plural_name %>", notice: "<%= singular_name.humanize %> deleted."
|
|
68
|
+
<% end -%>
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<%%= form_for @<%= singular_table_name %> do |f| %>
|
|
2
|
+
|
|
3
|
+
<% attributes.each do |attribute| -%>
|
|
4
|
+
<div>
|
|
5
|
+
<%%= f.label :<%= attribute.name %> %><br>
|
|
6
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %><%= "?" if attribute.type == :boolean %> %>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<% end -%>
|
|
10
|
+
<div>
|
|
11
|
+
<%%= f.submit %>
|
|
12
|
+
</div>
|
|
13
|
+
<%% end %>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%%= form_for(@<%= singular_table_name %>, html: { class: 'form-horizontal'}) do |f| %>
|
|
2
|
+
|
|
3
|
+
<% attributes.each do |attribute| -%>
|
|
4
|
+
<div class="form-group">
|
|
5
|
+
<%%= f.label :<%= attribute.name %>, class: 'col-md-2' %>
|
|
6
|
+
<%
|
|
7
|
+
colsize = 6
|
|
8
|
+
colsize = 2 if attribute.type == :integer
|
|
9
|
+
%>
|
|
10
|
+
<div class="col-md-<%= colsize %>">
|
|
11
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %><%= "?" if attribute.type == :boolean %>, class: 'form-control' %>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<% end -%>
|
|
16
|
+
<div class="form-group">
|
|
17
|
+
<div class="col-md-offset-2 col-md-6">
|
|
18
|
+
<%%= f.submit nil, class: 'btn btn-primary' %>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<%% end %>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<div class="page-header">
|
|
2
|
+
<h1><%= plural_table_name.humanize %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<% if named_routes? -%>
|
|
6
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', new_<%= singular_table_name %>_url, class: 'btn btn-primary' %></p>
|
|
7
|
+
<% else -%>
|
|
8
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', "/<%= plural_name %>/new", class: 'btn btn-primary' %></p>
|
|
9
|
+
<% end -%>
|
|
10
|
+
|
|
11
|
+
<table class="table table-hover">
|
|
12
|
+
<thead>
|
|
13
|
+
<tr>
|
|
14
|
+
<% attributes.each do |attribute| -%>
|
|
15
|
+
<th><%= attribute.human_name %></th>
|
|
16
|
+
<% end -%>
|
|
17
|
+
<th></th>
|
|
18
|
+
<th></th>
|
|
19
|
+
<th></th>
|
|
20
|
+
</tr>
|
|
21
|
+
</thead>
|
|
22
|
+
|
|
23
|
+
<tbody>
|
|
24
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
|
25
|
+
<tr>
|
|
26
|
+
<% attributes.each do |attribute| -%>
|
|
27
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>
|
|
28
|
+
<% end -%>
|
|
29
|
+
<% if named_routes? %>
|
|
30
|
+
<td><%%= link_to '<i class="fa fa-search-plus"></i>'.html_safe, <%= singular_table_name %>_url(<%= singular_table_name %>), class: 'btn btn-primary' %></td>
|
|
31
|
+
<td><%%= link_to '<i class="fa fa-edit"></i>'.html_safe, edit_<%= singular_table_name %>_url(<%= singular_table_name %>), class: 'btn btn-warning' %></td>
|
|
32
|
+
<td><%%= link_to '<i class="fa fa-trash-o"></i>'.html_safe, <%= singular_table_name %>_url(<%= singular_table_name %>), method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" }, class: 'btn btn-danger' %></td>
|
|
33
|
+
<% else %>
|
|
34
|
+
<td><%%= link_to '<i class="fa fa-search-plus"></i>'.html_safe, "/<%= plural_name %>/#{<%= singular_table_name %>.id}", class: 'btn btn-primary' %></td>
|
|
35
|
+
<td><%%= link_to '<i class="fa fa-edit"></i>'.html_safe, "/<%= plural_name %>/#{<%= singular_table_name %>.id}/edit", class: 'btn btn-warning' %></td>
|
|
36
|
+
<td><%%= link_to '<i class="fa fa-trash-o"></i>'.html_safe, "/<%= plural_name %>/#{<%= singular_table_name %>.id}", method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" }, class: 'btn btn-danger' %></td>
|
|
37
|
+
<% end %>
|
|
38
|
+
</tr>
|
|
39
|
+
<%% end %>
|
|
40
|
+
</tbody>
|
|
41
|
+
</table>
|
|
42
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<div class="page-header">
|
|
2
|
+
<h1><%= human_name.titleize %> #<%%= @<%= singular_table_name %>.id %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<dl class="dl-horizontal">
|
|
6
|
+
<% attributes.each do |attribute| -%>
|
|
7
|
+
<dt><%= attribute.human_name %></dt>
|
|
8
|
+
<dd><%%= @<%= singular_table_name %>.<%= attribute.name %> %></dd>
|
|
9
|
+
|
|
10
|
+
<% end %>
|
|
11
|
+
</dl>
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
class <%= plural_name.camelize %>Controller < ApplicationController
|
|
2
|
+
|
|
3
|
+
before_action :set_<%= singular_name.underscore %>, only: [:show, :edit, :update, :destroy]
|
|
4
|
+
|
|
5
|
+
def index
|
|
6
|
+
@<%= plural_name.underscore %> = <%= class_name %>.all
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def show
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def new
|
|
13
|
+
@<%= singular_name.underscore %> = <%= class_name %>.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create
|
|
17
|
+
@<%= singular_name.underscore %> = <%= class_name %>.new
|
|
18
|
+
<% attributes.each do |attribute| -%>
|
|
19
|
+
@<%= singular_name.underscore %>.<%= attribute.name %> = params[:<%= singular_name.underscore %>][:<%= attribute.name %>]
|
|
20
|
+
<% end %>
|
|
21
|
+
<% if named_routes? -%>
|
|
22
|
+
if @<%= singular_name.underscore %>.save
|
|
23
|
+
redirect_to <%= plural_name %>_url
|
|
24
|
+
else
|
|
25
|
+
render 'new'
|
|
26
|
+
end
|
|
27
|
+
<% else -%>
|
|
28
|
+
if @<%= singular_name.underscore %>.save
|
|
29
|
+
redirect_to "/<%= plural_name %>"
|
|
30
|
+
else
|
|
31
|
+
render 'new'
|
|
32
|
+
end
|
|
33
|
+
<% end -%>
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def edit
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def update
|
|
40
|
+
<% attributes.each do |attribute| -%>
|
|
41
|
+
@<%= singular_name.underscore %>.<%= attribute.name %> = params[:<%= singular_name.underscore %>][:<%= attribute.name %>]
|
|
42
|
+
<% end %>
|
|
43
|
+
<% if named_routes? -%>
|
|
44
|
+
if @<%= singular_name.underscore %>.save
|
|
45
|
+
redirect_to <%= plural_name %>_url
|
|
46
|
+
else
|
|
47
|
+
render 'new'
|
|
48
|
+
end
|
|
49
|
+
<% else -%>
|
|
50
|
+
if @<%= singular_name.underscore %>.save
|
|
51
|
+
redirect_to "/<%= plural_name %>"
|
|
52
|
+
else
|
|
53
|
+
render 'new'
|
|
54
|
+
end
|
|
55
|
+
<% end -%>
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def destroy
|
|
59
|
+
@<%= singular_name.underscore %>.destroy
|
|
60
|
+
<% if named_routes? -%>
|
|
61
|
+
redirect_to <%= plural_name %>_url
|
|
62
|
+
<% else -%>
|
|
63
|
+
redirect_to "/<%= plural_name %>"
|
|
64
|
+
<% end -%>
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def set_<%= singular_name.underscore %>
|
|
70
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find(params[:id])
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<h1><%= plural_table_name.humanize %></h1>
|
|
2
|
+
|
|
3
|
+
<% if named_routes? -%>
|
|
4
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', new_<%= singular_table_name %>_url %></p>
|
|
5
|
+
<% else -%>
|
|
6
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', "/<%= plural_name %>/new" %></p>
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<table>
|
|
10
|
+
<thead>
|
|
11
|
+
<tr>
|
|
12
|
+
<% attributes.each do |attribute| -%>
|
|
13
|
+
<th><%= attribute.human_name %></th>
|
|
14
|
+
<% end -%>
|
|
15
|
+
<th></th>
|
|
16
|
+
<th></th>
|
|
17
|
+
<th></th>
|
|
18
|
+
</tr>
|
|
19
|
+
</thead>
|
|
20
|
+
|
|
21
|
+
<tbody>
|
|
22
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
|
23
|
+
<tr>
|
|
24
|
+
<% attributes.each do |attribute| -%>
|
|
25
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %><%= "?" if attribute.type == :boolean %> %></td>
|
|
26
|
+
<% end -%>
|
|
27
|
+
<% if named_routes? %>
|
|
28
|
+
<td><%%= link_to 'Show', <%= singular_table_name %>_url(<%= singular_table_name %>) %></td>
|
|
29
|
+
<td><%%= link_to 'Edit', edit_<%= singular_table_name %>_url(<%= singular_table_name %>) %></td>
|
|
30
|
+
<td><%%= link_to 'Destroy', <%= singular_table_name %>_url(<%= singular_table_name %>), method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" } %></td>
|
|
31
|
+
<% else %>
|
|
32
|
+
<td><%%= link_to 'Show', "/<%= plural_name %>/#{<%= singular_table_name %>.id}" %></td>
|
|
33
|
+
<td><%%= link_to 'Edit', "/<%= plural_name %>/#{<%= singular_table_name %>.id}/edit" %></td>
|
|
34
|
+
<td><%%= link_to 'Destroy', "/<%= plural_name %>/#{<%= singular_table_name %>.id}", method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" } %></td>
|
|
35
|
+
<% end %>
|
|
36
|
+
</tr>
|
|
37
|
+
<%% end %>
|
|
38
|
+
</tbody>
|
|
39
|
+
</table>
|
|
40
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<h1>Editing <%= human_name.titleize %> #<%%= @<%= singular_table_name %>.id %></h1>
|
|
2
|
+
|
|
3
|
+
<% if named_routes? -%>
|
|
4
|
+
<%%= form_tag(<%= singular_table_name %>_url(@<%= singular_table_name %>), method: 'patch') do %>
|
|
5
|
+
<% else -%>
|
|
6
|
+
<%%= form_tag("/<%= plural_name %>/#{<%= singular_table_name %>.id}", method: 'patch') do %>
|
|
7
|
+
<% end -%>
|
|
8
|
+
<% attributes.each do |attribute| -%>
|
|
9
|
+
<div>
|
|
10
|
+
<%%= label_tag :<%= attribute.name %> %><br />
|
|
11
|
+
<% if attribute.field_type == :date_select || attribute.field_type == :time_select || attribute.field_type == :datetime_select -%>
|
|
12
|
+
<%%= text_field_tag :<%= attribute.name %>, @<%= singular_table_name %>.<%= attribute.name %> %>
|
|
13
|
+
<% elsif attribute.field_type == :check_box -%>
|
|
14
|
+
<%%= check_box_tag :<%= attribute.name %>, 1, @<%= singular_table_name %>.<%= attribute.name %>? %>
|
|
15
|
+
<% else -%>
|
|
16
|
+
<%%= <%= attribute.field_type %>_tag :<%= attribute.name %>, @<%= singular_table_name %>.<%= attribute.name %><%= "?" if attribute.type == :boolean %> %>
|
|
17
|
+
<% end -%>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<% end -%>
|
|
21
|
+
<div>
|
|
22
|
+
<%%= submit_tag "Update <%= human_name.titleize %>" %>
|
|
23
|
+
</div>
|
|
24
|
+
<%% end %>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<h1><%= plural_table_name.humanize %></h1>
|
|
2
|
+
|
|
3
|
+
<% if named_routes? -%>
|
|
4
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', new_<%= singular_table_name %>_url %></p>
|
|
5
|
+
<% else -%>
|
|
6
|
+
<p><%%= link_to 'Add a New <%= human_name.titleize %>', "/<%= plural_name %>/new" %></p>
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<table>
|
|
10
|
+
<thead>
|
|
11
|
+
<tr>
|
|
12
|
+
<% attributes.each do |attribute| -%>
|
|
13
|
+
<th><%= attribute.human_name %></th>
|
|
14
|
+
<% end -%>
|
|
15
|
+
<th></th>
|
|
16
|
+
<th></th>
|
|
17
|
+
<th></th>
|
|
18
|
+
</tr>
|
|
19
|
+
</thead>
|
|
20
|
+
|
|
21
|
+
<tbody>
|
|
22
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
|
23
|
+
<tr>
|
|
24
|
+
<% attributes.each do |attribute| -%>
|
|
25
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>
|
|
26
|
+
<% end -%>
|
|
27
|
+
<% if named_routes? -%>
|
|
28
|
+
<td><%%= link_to 'Show', <%= singular_table_name %>_url(<%= singular_table_name %>) %></td>
|
|
29
|
+
<td><%%= link_to 'Edit', edit_<%= singular_table_name %>_url(<%= singular_table_name %>) %></td>
|
|
30
|
+
<td><%%= link_to 'Destroy', <%= singular_table_name %>_url(<%= singular_table_name %>), method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" } %></td>
|
|
31
|
+
<% else -%>
|
|
32
|
+
<td><%%= link_to 'Show', "/<%= plural_name %>/#{<%= singular_table_name %>.id}" %></td>
|
|
33
|
+
<td><%%= link_to 'Edit', "/<%= plural_name %>/#{<%= singular_table_name %>.id}/edit" %></td>
|
|
34
|
+
<td><%%= link_to 'Destroy', "/<%= plural_name %>/#{<%= singular_table_name %>.id}", method: 'delete', data: { confirm: "Do you really want to delete this <%= singular_table_name %>?" } %></td>
|
|
35
|
+
<% end -%>
|
|
36
|
+
</tr>
|
|
37
|
+
<%% end %>
|
|
38
|
+
</tbody>
|
|
39
|
+
</table>
|
|
40
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :<%= table_name %> do |t|
|
|
4
|
+
<% attributes.each do |attribute| -%>
|
|
5
|
+
t.<%= attribute.type %> :<%= attribute.name %><%= attribute.inject_options %>
|
|
6
|
+
<% end -%>
|
|
7
|
+
<% if options[:timestamps] %>
|
|
8
|
+
t.timestamps
|
|
9
|
+
<% end -%>
|
|
10
|
+
end
|
|
11
|
+
<% attributes_with_index.each do |attribute| -%>
|
|
12
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
|
13
|
+
<% end -%>
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<h1>New <%= human_name.titleize %></h1>
|
|
2
|
+
|
|
3
|
+
<% if named_routes? -%>
|
|
4
|
+
<%%= form_tag(<%= plural_name %>_url, method: 'post') do %>
|
|
5
|
+
<% else -%>
|
|
6
|
+
<%%= form_tag('/<%= plural_name %>', method: 'post') do %>
|
|
7
|
+
<% end -%>
|
|
8
|
+
<% attributes.each do |attribute| -%>
|
|
9
|
+
<div>
|
|
10
|
+
<%%= label_tag :<%= attribute.name %> %><br />
|
|
11
|
+
<% if attribute.field_type == :date_select || attribute.field_type == :time_select || attribute.field_type == :datetime_select -%>
|
|
12
|
+
<%%= text_field_tag :<%= attribute.name %> %>
|
|
13
|
+
<% else -%>
|
|
14
|
+
<%%= <%= attribute.field_type %>_tag :<%= attribute.name %> %>
|
|
15
|
+
<% end -%>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<% end -%>
|
|
19
|
+
<div>
|
|
20
|
+
<%%= submit_tag "Create <%= human_name.titleize %>" %>
|
|
21
|
+
</div>
|
|
22
|
+
<%% end %>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<h1><%= human_name.titleize %> #<%%= @<%= singular_table_name %>.id %></h1>
|
|
2
|
+
|
|
3
|
+
<dl>
|
|
4
|
+
<% attributes.each do |attribute| -%>
|
|
5
|
+
<dt><%= attribute.human_name %></dt>
|
|
6
|
+
<dd><%%= @<%= singular_table_name %>.<%= attribute.name %><%= "?" if attribute.type == :boolean %> %></dd>
|
|
7
|
+
|
|
8
|
+
<% end -%>
|
|
9
|
+
</dl>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Injects the Bootstrap framework, FontAwesome support, and a standard application layout template into your app.
|
|
3
|
+
|
|
4
|
+
The application layout will provide a standard top navbar based on the models already in your application, with support for flash messages.
|
|
5
|
+
|
|
6
|
+
Specify "default" as the THEME_NAME to use the default bootstrap theme. Or, provide a Bootswatch name instead.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
THEME_NAME can be one of:
|
|
10
|
+
amelia, cerulian, cyborg, default, journal, geo, readable, simplex, slate, spacelab, spruce, superhero, united
|
|
11
|
+
|
|
12
|
+
LAYOUT_FILE defaults to "application".
|
|
13
|
+
|
|
14
|
+
WARNING: You will LOSE any modifications you've made to your application layout unless you specify a different filename with the --layout-file option.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
`rails generate starter:style default`
|
|
18
|
+
|
|
19
|
+
Injects Bootstrap 3.0 into your CSS folder, adjusts your applications' css manifest, and replaces your application layout with a standard Bootstrap template and a navigation bar based on your models.
|
|
20
|
+
|
|
21
|
+
`rails generate starter:style --no-navbar`
|
|
22
|
+
|
|
23
|
+
Injects Bootstrap 3.0 into your CSS folder, adjusts your applications' css manifest, and replaces your application layout with a standard Bootstrap template.
|
|
24
|
+
|
|
25
|
+
`rails generate starter:style united`
|
|
26
|
+
|
|
27
|
+
Injects Bootstrap 3.0 into your CSS folder, adjusts your applications' css manifest, and replaces your application layout with the United bootswatch theme.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Starter
|
|
2
|
+
class StyleGenerator < Rails::Generators::Base
|
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
4
|
+
|
|
5
|
+
argument :theme_name, :type => :string#, :default => 'default'
|
|
6
|
+
|
|
7
|
+
class_option :layout, :type => :boolean, :default => true, :desc => "Generate a new application layout."
|
|
8
|
+
class_option :navbar, :type => :boolean, :default => true, :desc => "Generate a model-based navbar."
|
|
9
|
+
argument :layout_file, :type => :string, :default => 'application', :desc => "Layout filename"
|
|
10
|
+
|
|
11
|
+
def generate_layout
|
|
12
|
+
if bootswatch_theme?
|
|
13
|
+
log :insert, "Bootswatch theme '#{theme_name}'"
|
|
14
|
+
else
|
|
15
|
+
log :insert, 'Bootstrap CSS framework'
|
|
16
|
+
end
|
|
17
|
+
log :insert, 'FontAwesome support'
|
|
18
|
+
template "layout.html.erb", "app/views/layouts/#{layout_file}.html.erb" if options[:layout]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def bootswatch_theme?
|
|
24
|
+
if theme_name.present?
|
|
25
|
+
(theme_name.downcase != 'default') && (theme_name.downcase != 'd')
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def app_tables
|
|
30
|
+
ActiveRecord::Base.connection.tables - ['schema_migrations']
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title><%= Rails.application.class.parent_name %></title>
|
|
6
|
+
|
|
7
|
+
<% if bootswatch_theme? -%>
|
|
8
|
+
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootswatch/3.0.2/<%= theme_name %>/bootstrap.min.css">
|
|
9
|
+
<% else %>
|
|
10
|
+
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
|
|
11
|
+
<% end -%>
|
|
12
|
+
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.2/css/font-awesome.min.css">
|
|
13
|
+
|
|
14
|
+
<style>
|
|
15
|
+
/* Only necessary if you are using navbar-fixed-top */
|
|
16
|
+
body {
|
|
17
|
+
padding-top: 50px;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
20
|
+
|
|
21
|
+
<%%= stylesheet_link_tag "application", :media => "all" %>
|
|
22
|
+
<%%= javascript_include_tag "application" %>
|
|
23
|
+
<%%= csrf_meta_tags %>
|
|
24
|
+
|
|
25
|
+
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>
|
|
26
|
+
|
|
27
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
28
|
+
</head>
|
|
29
|
+
<body>
|
|
30
|
+
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
|
|
31
|
+
<!-- Brand and toggle get grouped for better mobile display -->
|
|
32
|
+
<div class="navbar-header">
|
|
33
|
+
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
|
|
34
|
+
<span class="sr-only">Toggle navigation</span>
|
|
35
|
+
<span class="icon-bar"></span>
|
|
36
|
+
<span class="icon-bar"></span>
|
|
37
|
+
<span class="icon-bar"></span>
|
|
38
|
+
</button>
|
|
39
|
+
<%%= link_to Rails.application.class.parent_name, root_url, :class => "navbar-brand" %>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<!-- Collect the nav links, forms, and other content for toggling -->
|
|
43
|
+
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
|
44
|
+
<ul class="nav navbar-nav">
|
|
45
|
+
<% if options[:navbar] -%>
|
|
46
|
+
<% app_tables.each do |table_name| -%>
|
|
47
|
+
<li><%%= link_to "<%= table_name.humanize.titleize %>", <%= table_name.pluralize %>_url %></li>
|
|
48
|
+
<% end -%>
|
|
49
|
+
<li><a href="#">About</a></li>
|
|
50
|
+
<% end -%>
|
|
51
|
+
</ul>
|
|
52
|
+
</div><!-- /.navbar-collapse -->
|
|
53
|
+
</nav>
|
|
54
|
+
|
|
55
|
+
<div class="container">
|
|
56
|
+
<%% if notice.present? %>
|
|
57
|
+
<div class="alert alert-dismissable alert-success">
|
|
58
|
+
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
|
59
|
+
<%%= notice %>
|
|
60
|
+
</div>
|
|
61
|
+
<%% end %>
|
|
62
|
+
|
|
63
|
+
<%%= yield %>
|
|
64
|
+
</div>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
class <%= plural_name.camelize %>Controller < ApplicationController
|
|
2
|
+
|
|
3
|
+
before_action :require_login, :only => [:show, :edit, :update, :destroy]
|
|
4
|
+
|
|
5
|
+
def show
|
|
6
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def create
|
|
13
|
+
@<%= singular_name.underscore %> = <%= class_name %>.new
|
|
14
|
+
<% attributes.each do |attribute| -%>
|
|
15
|
+
@<%= singular_name.underscore %>.<%= attribute.name %> = params[:<%= attribute.name %>]
|
|
16
|
+
<% end -%>
|
|
17
|
+
|
|
18
|
+
<% if named_routes? -%>
|
|
19
|
+
if @<%= singular_name.underscore %>.save
|
|
20
|
+
redirect_to <%= plural_name %>_url, notice: "<%= singular_name.humanize %> created successfully."
|
|
21
|
+
else
|
|
22
|
+
render 'new'
|
|
23
|
+
end
|
|
24
|
+
<% else -%>
|
|
25
|
+
if @<%= singular_name.underscore %>.save
|
|
26
|
+
redirect_to "/<%= plural_name %>", notice: "<%= singular_name.humanize %> created successfully."
|
|
27
|
+
else
|
|
28
|
+
render 'new'
|
|
29
|
+
end
|
|
30
|
+
<% end -%>
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def edit
|
|
34
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def update
|
|
38
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
39
|
+
<% attributes.each do |attribute| -%>
|
|
40
|
+
@<%= singular_name.underscore %>.<%= attribute.name %> = params[:<%= attribute.name %>]
|
|
41
|
+
<% end -%>
|
|
42
|
+
|
|
43
|
+
<% if named_routes? -%>
|
|
44
|
+
if @<%= singular_name.underscore %>.save
|
|
45
|
+
redirect_to <%= plural_name %>_url, notice: "<%= singular_name.humanize %> updated successfully."
|
|
46
|
+
else
|
|
47
|
+
render 'edit'
|
|
48
|
+
end
|
|
49
|
+
<% else -%>
|
|
50
|
+
if @<%= singular_name.underscore %>.save
|
|
51
|
+
redirect_to "/<%= plural_name %>", notice: "<%= singular_name.humanize %> updated successfully."
|
|
52
|
+
else
|
|
53
|
+
render 'edit'
|
|
54
|
+
end
|
|
55
|
+
<% end -%>
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def destroy
|
|
59
|
+
@<%= singular_name.underscore %> = <%= class_name %>.find_by(id: params[:id])
|
|
60
|
+
@<%= singular_name.underscore %>.destroy
|
|
61
|
+
|
|
62
|
+
<% if named_routes? -%>
|
|
63
|
+
redirect_to <%= plural_name %>_url, notice: "<%= singular_name.humanize %> deleted."
|
|
64
|
+
<% else -%>
|
|
65
|
+
redirect_to "/<%= plural_name %>", notice: "<%= singular_name.humanize %> deleted."
|
|
66
|
+
<% end -%>
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'rails/generators/active_record'
|
|
2
|
+
require_relative './migration'
|
|
3
|
+
module Starter
|
|
4
|
+
class UserGenerator < Rails::Generators::NamedBase
|
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
6
|
+
include Rails::Generators::ResourceHelpers
|
|
7
|
+
include Rails::Generators::Migration
|
|
8
|
+
extend ActiveRecord::Generators::Migration
|
|
9
|
+
|
|
10
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
|
11
|
+
remove_class_option :old_style_hash
|
|
12
|
+
remove_class_option :force_plural
|
|
13
|
+
remove_class_option :skip_namespace
|
|
14
|
+
class_option :styled, :type => :boolean, :default => true, desc: 'Generates bootstrap-ready view templates'
|
|
15
|
+
|
|
16
|
+
def generate_controller
|
|
17
|
+
template 'user_controller.rb', "app/controllers/#{plural_name.underscore}_controller.rb"
|
|
18
|
+
template 'sessions_controller.rb', "app/controllers/sessions_controller.rb"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def generate_model
|
|
22
|
+
template 'model.rb', "app/models/#{singular_name.underscore}.rb"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def generate_migration
|
|
26
|
+
return if options[:skip_model]
|
|
27
|
+
migration_template "migration.rb", "db/migrate/create_#{table_name}.rb"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# def create_root_view_folder
|
|
31
|
+
# empty_directory File.join("app/views", controller_file_path)
|
|
32
|
+
# end
|
|
33
|
+
|
|
34
|
+
def copy_view_files
|
|
35
|
+
available_views.each do |view|
|
|
36
|
+
filename = view_filename_with_extensions(view)
|
|
37
|
+
template filename, File.join("app/views", controller_file_path, File.basename(filename))
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def generate_routes
|
|
43
|
+
route user_routes, "Routes"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
protected
|
|
47
|
+
|
|
48
|
+
def user_routes
|
|
49
|
+
["# Routes for sign up, user profile management, login, and logout:",
|
|
50
|
+
" get '/#{plural_name}/new' => '#{plural_name}#new'",
|
|
51
|
+
" get '/#{plural_name}/create' => '#{plural_name}#create'",
|
|
52
|
+
" get '/#{plural_name}/:#{singular_name}/show' => '#{plural_name}#show'",
|
|
53
|
+
" get '/#{plural_name}/:#{singular_name}/edit' => '#{plural_name}#edit'",
|
|
54
|
+
" get '/#{plural_name}/:#{singular_name}/update' => '#{plural_name}#update'",
|
|
55
|
+
" get '/#{plural_name}/:#{singular_name}/delete' => '#{plural_name}#destroy'",
|
|
56
|
+
" ",
|
|
57
|
+
" get '/login' => 'sessions#new'",
|
|
58
|
+
" get '/handle_login' => 'sessions#create'",
|
|
59
|
+
" get '/logout' => 'sessions#logout'"
|
|
60
|
+
|
|
61
|
+
].join("\n")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Override of Rails::Generators::Actions
|
|
65
|
+
def route(routing_code, title)
|
|
66
|
+
log :route, title
|
|
67
|
+
sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
|
|
68
|
+
|
|
69
|
+
in_root do
|
|
70
|
+
inject_into_file 'config/routes.rb', "\n #{routing_code}\n", { :after => sentinel, :verbose => false }
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def attributes_with_index
|
|
75
|
+
attributes.select { |a| a.has_index? || (a.reference? && options[:indexes]) }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def available_views
|
|
79
|
+
dry? ? %w(index new edit show _form) : %w(index new edit show)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def view_filename_with_extensions(name)
|
|
83
|
+
filename = [name, :html, :erb].compact.join(".")
|
|
84
|
+
folders = []
|
|
85
|
+
folders << 'dried' if dry?
|
|
86
|
+
folders << 'bootstrapped' if styled?
|
|
87
|
+
filename = File.join(folders, filename) if folders.any?
|
|
88
|
+
return filename
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Generates "CRUD"-style views
|
|
3
|
+
|
|
4
|
+
Pass the name of the model (in singular form), either CamelCased or
|
|
5
|
+
under_scored, as the first argument, and an optional list of attribute
|
|
6
|
+
pairs.
|
|
7
|
+
|
|
8
|
+
Attributes are field arguments specifying the model's attributes. You can
|
|
9
|
+
optionally pass the type and an index to each field. For instance:
|
|
10
|
+
"title body:text tracking_id:integer:uniq" will generate a title field of
|
|
11
|
+
string type, a body with text type and a tracking_id as an integer with an
|
|
12
|
+
unique index. "index" could also be given instead of "uniq" if one desires
|
|
13
|
+
a non unique index.
|
|
14
|
+
|
|
15
|
+
Timestamps are added by default, so you don't have to specify them by hand
|
|
16
|
+
as 'created_at:datetime updated_at:datetime'.
|
|
17
|
+
|
|
18
|
+
You don't have to think up every attribute up front, but it helps to
|
|
19
|
+
sketch out a few so you can start working with the resource immediately.
|
|
20
|
+
|
|
21
|
+
For example, 'starter:resource post title body:text published:boolean' gives
|
|
22
|
+
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 the Golden Seven "RESTful" routes
|
|
25
|
+
in config/routes.rb.
|
|
26
|
+
|
|
27
|
+
If you want to remove all the generated files, first rollback your migration
|
|
28
|
+
with 'rake db:rollback' if you've already run 'rake db:migrate'. Then run
|
|
29
|
+
'rails destroy starter:resource ModelName'.
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
`rails generate starter:resource post title body:text published:boolean`
|
|
33
|
+
`rails generate starter:resource purchase amount:decimal tracking_id:integer:uniq`
|
data/lib/tasks/ez_tasks.rake
CHANGED
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
namespace :ez do
|
|
2
2
|
|
|
3
|
-
desc "
|
|
4
|
-
task :
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
desc "Automatically update the database schema and model files."
|
|
8
|
-
task :tables => :environment do
|
|
9
|
-
if File.exists?('db/models.yml')
|
|
10
|
-
DomainModeler.update_tables
|
|
11
|
-
Rake::Task["db:schema:dump"].invoke
|
|
12
|
-
else
|
|
13
|
-
emit_help_page
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def emit_help_page
|
|
18
|
-
puts "To get started, edit the db/models.yml file to describe your table schema."
|
|
19
|
-
File.open("db/models.yml", "w") do |f|
|
|
3
|
+
desc "Generate models.yml if it doesn't exist yet."
|
|
4
|
+
task :generate_yml do
|
|
5
|
+
File.open("db/models.yml", "w") do |f|
|
|
20
6
|
f.puts <<-EOS
|
|
21
7
|
# Example table for a typical Book model.
|
|
22
8
|
#
|
|
@@ -33,4 +19,25 @@ namespace :ez do
|
|
|
33
19
|
EOS
|
|
34
20
|
end
|
|
35
21
|
end
|
|
22
|
+
|
|
23
|
+
desc "Reset the database schema and data from scratch."
|
|
24
|
+
task :reset_tables => ['db:drop', :tables] do
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
desc "Attempts to update the database schema and model files with minimal data loss."
|
|
29
|
+
task :tables => :environment do
|
|
30
|
+
if File.exists?('db/models.yml')
|
|
31
|
+
DomainModeler.update_tables
|
|
32
|
+
Rake::Task["db:schema:dump"].invoke
|
|
33
|
+
else
|
|
34
|
+
emit_help_page
|
|
35
|
+
Rake::Task["generate_yml"].invoke
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def emit_help_page
|
|
40
|
+
puts "To get started, edit the db/models.yml file to describe your table schema."
|
|
41
|
+
|
|
42
|
+
end
|
|
36
43
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ez
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jeff Cohen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-03-
|
|
11
|
+
date: 2014-03-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -65,6 +65,37 @@ files:
|
|
|
65
65
|
- lib/ez/mapper.rb
|
|
66
66
|
- lib/ez/schema_modifier.rb
|
|
67
67
|
- lib/ez/version.rb
|
|
68
|
+
- lib/generators/ez/resource/USAGE
|
|
69
|
+
- lib/generators/ez/resource/migration.rb
|
|
70
|
+
- lib/generators/ez/resource/resource_generator.rb
|
|
71
|
+
- lib/generators/ez/resource/templates/bootstrapped/edit.html.erb
|
|
72
|
+
- lib/generators/ez/resource/templates/bootstrapped/index.html.erb
|
|
73
|
+
- lib/generators/ez/resource/templates/bootstrapped/new.html.erb
|
|
74
|
+
- lib/generators/ez/resource/templates/bootstrapped/show.html.erb
|
|
75
|
+
- lib/generators/ez/resource/templates/controller.rb
|
|
76
|
+
- lib/generators/ez/resource/templates/dried/_form.html.erb
|
|
77
|
+
- lib/generators/ez/resource/templates/dried/bootstrapped/_form.html.erb
|
|
78
|
+
- lib/generators/ez/resource/templates/dried/bootstrapped/edit.html.erb
|
|
79
|
+
- lib/generators/ez/resource/templates/dried/bootstrapped/index.html.erb
|
|
80
|
+
- lib/generators/ez/resource/templates/dried/bootstrapped/new.html.erb
|
|
81
|
+
- lib/generators/ez/resource/templates/dried/bootstrapped/show.html.erb
|
|
82
|
+
- lib/generators/ez/resource/templates/dried/controller.rb
|
|
83
|
+
- lib/generators/ez/resource/templates/dried/edit.html.erb
|
|
84
|
+
- lib/generators/ez/resource/templates/dried/index.html.erb
|
|
85
|
+
- lib/generators/ez/resource/templates/dried/new.html.erb
|
|
86
|
+
- lib/generators/ez/resource/templates/dried/show.html.erb
|
|
87
|
+
- lib/generators/ez/resource/templates/edit.html.erb
|
|
88
|
+
- lib/generators/ez/resource/templates/index.html.erb
|
|
89
|
+
- lib/generators/ez/resource/templates/migration.rb
|
|
90
|
+
- lib/generators/ez/resource/templates/model.rb
|
|
91
|
+
- lib/generators/ez/resource/templates/new.html.erb
|
|
92
|
+
- lib/generators/ez/resource/templates/show.html.erb
|
|
93
|
+
- lib/generators/ez/style/USAGE
|
|
94
|
+
- lib/generators/ez/style/style_generator.rb
|
|
95
|
+
- lib/generators/ez/style/templates/layout.html.erb
|
|
96
|
+
- lib/generators/ez/user/templates/user_controller.rb
|
|
97
|
+
- lib/generators/ez/user/user_generator.rb
|
|
98
|
+
- lib/generators/ez/views/USAGE
|
|
68
99
|
- lib/tasks/ez_tasks.rake
|
|
69
100
|
homepage: http://www.jeffcohenonline.com/ez
|
|
70
101
|
licenses:
|