view_mapper 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/README.rdoc +44 -0
  2. data/Rakefile +0 -1
  3. data/VERSION +1 -1
  4. data/generators/view_for/view_for_generator.rb +6 -2
  5. data/lib/view_mapper/paperclip_templates/controller.rb +85 -0
  6. data/lib/view_mapper/paperclip_templates/fixtures.yml +19 -0
  7. data/lib/view_mapper/paperclip_templates/functional_test.rb +45 -0
  8. data/lib/view_mapper/paperclip_templates/helper.rb +2 -0
  9. data/lib/view_mapper/paperclip_templates/helper_test.rb +4 -0
  10. data/lib/view_mapper/paperclip_templates/layout.html.erb +17 -0
  11. data/lib/view_mapper/paperclip_templates/migration.rb +22 -0
  12. data/lib/view_mapper/paperclip_templates/model.rb +8 -0
  13. data/lib/view_mapper/paperclip_templates/style.css +54 -0
  14. data/lib/view_mapper/paperclip_templates/unit_test.rb +8 -0
  15. data/lib/view_mapper/paperclip_templates/view_edit.html.erb +23 -0
  16. data/lib/view_mapper/paperclip_templates/view_index.html.erb +24 -0
  17. data/lib/view_mapper/paperclip_templates/view_new.html.erb +22 -0
  18. data/lib/view_mapper/paperclip_templates/view_show.html.erb +17 -0
  19. data/lib/view_mapper/paperclip_view.rb +125 -0
  20. data/lib/view_mapper/view_mapper.rb +4 -0
  21. data/lib/view_mapper.rb +1 -0
  22. data/test/auto_complete_test.rb +0 -17
  23. data/test/expected_templates/paperclip/create_testies.rb +23 -0
  24. data/test/expected_templates/paperclip/edit.html.erb +31 -0
  25. data/test/expected_templates/paperclip/index.html.erb +24 -0
  26. data/test/expected_templates/paperclip/new.html.erb +30 -0
  27. data/test/expected_templates/paperclip/show.html.erb +28 -0
  28. data/test/expected_templates/paperclip/testy.rb +4 -0
  29. data/test/paperclip_view_test.rb +299 -0
  30. data/test/rails_generator/generators/components/model/model_generator.rb +45 -0
  31. data/test/test_helper.rb +55 -7
  32. data/test/view_for_generator_test.rb +2 -2
  33. data/view_mapper.gemspec +31 -4
  34. metadata +31 -4
  35. data/README +0 -116
data/README.rdoc ADDED
@@ -0,0 +1,44 @@
1
+ =View Mapper
2
+
3
+ View Mapper will generate scaffolding code and map it to your existing models.
4
+
5
+ When you run the "view_for" generator, View Mapper will generate the view scaffolding code for your model, enhanced to use the specified plugin or feature with your model's attributes. For example:
6
+
7
+ script/generate view_for office --view auto_complete:address
8
+
9
+ ...will generate an "auto_complete view" for your existing office model. This is scaffolding that uses the attributes for your office model, and with code added to use the auto_complete plugin for the address field.
10
+
11
+ script/generate view_for song --view paperclip
12
+
13
+ ...will generate a "paperclip view" for your existing song model. This is scaffolding that will support viewing and editing your song model and its Paperclip attachments. It's a good way to learn how to use Paperclip if you aren't familiar with it yet.
14
+
15
+ Currently View Mapper supports views for the auto_complete and paperclip plugins. If you don't specify any view then View Mapper by default will generate standard Rails scaffolding.
16
+
17
+ If you also want to create a new model at the same time, then use a second View Mapper generator called "scaffold_for_view" and provide the model's attributes in the usual way:
18
+
19
+ script/generate scaffold_for_view office address:string code:string --view auto_complete:address
20
+
21
+ == Installation:
22
+
23
+ gem sources -a http://gemcutter.org
24
+ sudo gem install view_mapper
25
+
26
+ == Usage:
27
+
28
+ script/generate view_for model [ --view view_name[:param] ]
29
+
30
+ This will generate scaffolding for an existing model. If you provide a view parameter, then View Mapper will enhance the scaffolding to use the specified plugin or feature with your model.
31
+
32
+ script/generate scaffold_for_view model attributes [ --view view_name[:param] ]
33
+
34
+ This is the same as view_for, but will also generate a new model at the same time.
35
+
36
+ == Views
37
+
38
+ {auto_complete}[http://patshaughnessy.net/2009/10/1/auto_complete-scaffolding]: Generates scaffolding that uses the standard Rails auto_complete plugin for type ahead behavior.
39
+
40
+ {paperclip}[http://patshaughnessy.net/2009/10/16/paperclip-scaffolding]: Generates scaffolding that uses Paperclip to upload and download files.
41
+
42
+ == Examples
43
+
44
+ For detailed examples and more information see: http://patshaughnessy.net/view_mapper
data/Rakefile CHANGED
@@ -13,7 +13,6 @@ begin
13
13
  gem.add_development_dependency "thoughtbot-shoulda"
14
14
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
15
  end
16
- Jeweler::GemcutterTasks.new
17
16
  rescue LoadError
18
17
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
19
18
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -30,7 +30,7 @@ class ViewForGenerator < ScaffoldGenerator
30
30
  @model = nil
31
31
  end
32
32
  rescue NameError
33
- logger.error "Class '#{model_name}' does not exist."
33
+ logger.error "Class '#{model_name}' does not exist or contains a syntax error and could not be loaded."
34
34
  rescue ActiveRecord::StatementInvalid
35
35
  logger.error "Table for model '#{model_name}' does not exist - run rake db:migrate first."
36
36
  end
@@ -38,10 +38,14 @@ class ViewForGenerator < ScaffoldGenerator
38
38
 
39
39
  def custom_columns
40
40
  @model.columns.reject do |col|
41
- BUILT_IN_COLUMNS.include? col.name
41
+ built_in_columns.include? col.name
42
42
  end
43
43
  end
44
44
 
45
+ def built_in_columns
46
+ BUILT_IN_COLUMNS
47
+ end
48
+
45
49
  def record
46
50
  EditableManifest.new(self) { |m| yield m }
47
51
  end
@@ -0,0 +1,85 @@
1
+ class <%= controller_class_name %>Controller < ApplicationController
2
+ # GET /<%= table_name %>
3
+ # GET /<%= table_name %>.xml
4
+ def index
5
+ @<%= table_name %> = <%= class_name %>.all
6
+
7
+ respond_to do |format|
8
+ format.html # index.html.erb
9
+ format.xml { render :xml => @<%= table_name %> }
10
+ end
11
+ end
12
+
13
+ # GET /<%= table_name %>/1
14
+ # GET /<%= table_name %>/1.xml
15
+ def show
16
+ @<%= file_name %> = <%= class_name %>.find(params[:id])
17
+
18
+ respond_to do |format|
19
+ format.html # show.html.erb
20
+ format.xml { render :xml => @<%= file_name %> }
21
+ end
22
+ end
23
+
24
+ # GET /<%= table_name %>/new
25
+ # GET /<%= table_name %>/new.xml
26
+ def new
27
+ @<%= file_name %> = <%= class_name %>.new
28
+
29
+ respond_to do |format|
30
+ format.html # new.html.erb
31
+ format.xml { render :xml => @<%= file_name %> }
32
+ end
33
+ end
34
+
35
+ # GET /<%= table_name %>/1/edit
36
+ def edit
37
+ @<%= file_name %> = <%= class_name %>.find(params[:id])
38
+ end
39
+
40
+ # POST /<%= table_name %>
41
+ # POST /<%= table_name %>.xml
42
+ def create
43
+ @<%= file_name %> = <%= class_name %>.new(params[:<%= file_name %>])
44
+
45
+ respond_to do |format|
46
+ if @<%= file_name %>.save
47
+ flash[:notice] = '<%= class_name %> was successfully created.'
48
+ format.html { redirect_to(@<%= file_name %>) }
49
+ format.xml { render :xml => @<%= file_name %>, :status => :created, :location => @<%= file_name %> }
50
+ else
51
+ format.html { render :action => "new" }
52
+ format.xml { render :xml => @<%= file_name %>.errors, :status => :unprocessable_entity }
53
+ end
54
+ end
55
+ end
56
+
57
+ # PUT /<%= table_name %>/1
58
+ # PUT /<%= table_name %>/1.xml
59
+ def update
60
+ @<%= file_name %> = <%= class_name %>.find(params[:id])
61
+
62
+ respond_to do |format|
63
+ if @<%= file_name %>.update_attributes(params[:<%= file_name %>])
64
+ flash[:notice] = '<%= class_name %> was successfully updated.'
65
+ format.html { redirect_to(@<%= file_name %>) }
66
+ format.xml { head :ok }
67
+ else
68
+ format.html { render :action => "edit" }
69
+ format.xml { render :xml => @<%= file_name %>.errors, :status => :unprocessable_entity }
70
+ end
71
+ end
72
+ end
73
+
74
+ # DELETE /<%= table_name %>/1
75
+ # DELETE /<%= table_name %>/1.xml
76
+ def destroy
77
+ @<%= file_name %> = <%= class_name %>.find(params[:id])
78
+ @<%= file_name %>.destroy
79
+
80
+ respond_to do |format|
81
+ format.html { redirect_to(<%= table_name %>_url) }
82
+ format.xml { head :ok }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,19 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+
3
+ <% unless attributes.empty? -%>
4
+ one:
5
+ <% for attribute in attributes -%>
6
+ <%= attribute.name %>: <%= attribute.default %>
7
+ <% end -%>
8
+
9
+ two:
10
+ <% for attribute in attributes -%>
11
+ <%= attribute.name %>: <%= attribute.default %>
12
+ <% end -%>
13
+ <% else -%>
14
+ # one:
15
+ # column: value
16
+ #
17
+ # two:
18
+ # column: value
19
+ <% end -%>
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ class <%= controller_class_name %>ControllerTest < ActionController::TestCase
4
+ test "should get index" do
5
+ get :index
6
+ assert_response :success
7
+ assert_not_nil assigns(:<%= table_name %>)
8
+ end
9
+
10
+ test "should get new" do
11
+ get :new
12
+ assert_response :success
13
+ end
14
+
15
+ test "should create <%= file_name %>" do
16
+ assert_difference('<%= class_name %>.count') do
17
+ post :create, :<%= file_name %> => { }
18
+ end
19
+
20
+ assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
21
+ end
22
+
23
+ test "should show <%= file_name %>" do
24
+ get :show, :id => <%= table_name %>(:one).to_param
25
+ assert_response :success
26
+ end
27
+
28
+ test "should get edit" do
29
+ get :edit, :id => <%= table_name %>(:one).to_param
30
+ assert_response :success
31
+ end
32
+
33
+ test "should update <%= file_name %>" do
34
+ put :update, :id => <%= table_name %>(:one).to_param, :<%= file_name %> => { }
35
+ assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
36
+ end
37
+
38
+ test "should destroy <%= file_name %>" do
39
+ assert_difference('<%= class_name %>.count', -1) do
40
+ delete :destroy, :id => <%= table_name %>(:one).to_param
41
+ end
42
+
43
+ assert_redirected_to <%= table_name %>_path
44
+ end
45
+ end
@@ -0,0 +1,2 @@
1
+ module <%= controller_class_name %>Helper
2
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class <%= controller_class_name %>HelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
+ <title><%= controller_class_name %>: <%%= controller.action_name %></title>
8
+ <%%= stylesheet_link_tag 'scaffold' %>
9
+ </head>
10
+ <body>
11
+
12
+ <p style="color: green"><%%= flash[:notice] %></p>
13
+
14
+ <%%= yield %>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,22 @@
1
+ class <%= migration_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= table_name %> do |t|
4
+ <% for attribute in attributes -%>
5
+ t.<%= attribute.type %> :<%= attribute.name %>
6
+ <% end -%>
7
+ <% for attachment in attachments -%>
8
+ t.string :<%= attachment %>_file_name
9
+ t.string :<%= attachment %>_content_type
10
+ t.integer :<%= attachment %>_file_size
11
+ t.datetime :<%= attachment %>_updated_at
12
+ <% end -%>
13
+ <% unless options[:skip_timestamps] %>
14
+ t.timestamps
15
+ <% end -%>
16
+ end
17
+ end
18
+
19
+ def self.down
20
+ drop_table :<%= table_name %>
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ <% attributes.select(&:reference?).each do |attribute| -%>
3
+ belongs_to :<%= attribute.name %>
4
+ <% end -%>
5
+ <% for attachment in attachments -%>
6
+ has_attached_file :<%= attachment %>
7
+ <% end -%>
8
+ end
@@ -0,0 +1,54 @@
1
+ body { background-color: #fff; color: #333; }
2
+
3
+ body, p, ol, ul, td {
4
+ font-family: verdana, arial, helvetica, sans-serif;
5
+ font-size: 13px;
6
+ line-height: 18px;
7
+ }
8
+
9
+ pre {
10
+ background-color: #eee;
11
+ padding: 10px;
12
+ font-size: 11px;
13
+ }
14
+
15
+ a { color: #000; }
16
+ a:visited { color: #666; }
17
+ a:hover { color: #fff; background-color:#000; }
18
+
19
+ .fieldWithErrors {
20
+ padding: 2px;
21
+ background-color: red;
22
+ display: table;
23
+ }
24
+
25
+ #errorExplanation {
26
+ width: 400px;
27
+ border: 2px solid red;
28
+ padding: 7px;
29
+ padding-bottom: 12px;
30
+ margin-bottom: 20px;
31
+ background-color: #f0f0f0;
32
+ }
33
+
34
+ #errorExplanation h2 {
35
+ text-align: left;
36
+ font-weight: bold;
37
+ padding: 5px 5px 5px 15px;
38
+ font-size: 12px;
39
+ margin: -7px;
40
+ background-color: #c00;
41
+ color: #fff;
42
+ }
43
+
44
+ #errorExplanation p {
45
+ color: #333;
46
+ margin-bottom: 0;
47
+ padding: 5px;
48
+ }
49
+
50
+ #errorExplanation ul li {
51
+ font-size: 12px;
52
+ list-style: square;
53
+ }
54
+
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class <%= class_name %>Test < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ test "the truth" do
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ <h1>Editing <%= singular_name %></h1>
2
+
3
+ <%% form_for(@<%= singular_name %>, :html => { :multipart => true }) do |f| %>
4
+ <%%= f.error_messages %>
5
+ <% for attribute in attributes -%>
6
+ <p>
7
+ <%%= f.label :<%= attribute.name %> %><br />
8
+ <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
9
+ </p>
10
+ <% end -%>
11
+ <% for attachment in attachments -%>
12
+ <p>
13
+ <%%= f.label :<%= attachment%> %><br />
14
+ <%%= f.file_field :<%= attachment%> %>
15
+ </p>
16
+ <% end -%>
17
+ <p>
18
+ <%%= f.submit 'Update' %>
19
+ </p>
20
+ <%% end %>
21
+
22
+ <%%= link_to 'Show', @<%= singular_name %> %> |
23
+ <%%= link_to 'Back', <%= plural_name %>_path %>
@@ -0,0 +1,24 @@
1
+ <h1>Listing <%= plural_name %></h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <% for attribute in attributes -%>
6
+ <th><%= attribute.column.human_name %></th>
7
+ <% end -%>
8
+ </tr>
9
+
10
+ <%% @<%= plural_name %>.each do |<%= singular_name %>| %>
11
+ <tr>
12
+ <% for attribute in attributes -%>
13
+ <td><%%=h <%= singular_name %>.<%= attribute.name %> %></td>
14
+ <% end -%>
15
+ <td><%%= link_to 'Show', <%= singular_name %> %></td>
16
+ <td><%%= link_to 'Edit', edit_<%= singular_name %>_path(<%= singular_name %>) %></td>
17
+ <td><%%= link_to 'Destroy', <%= singular_name %>, :confirm => 'Are you sure?', :method => :delete %></td>
18
+ </tr>
19
+ <%% end %>
20
+ </table>
21
+
22
+ <br />
23
+
24
+ <%%= link_to 'New <%= singular_name %>', new_<%= singular_name %>_path %>
@@ -0,0 +1,22 @@
1
+ <h1>New <%= singular_name %></h1>
2
+
3
+ <%% form_for(@<%= singular_name %>, :html => { :multipart => true }) do |f| %>
4
+ <%%= f.error_messages %>
5
+ <% for attribute in attributes -%>
6
+ <p>
7
+ <%%= f.label :<%= attribute.name %> %><br />
8
+ <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
9
+ </p>
10
+ <%- end -%>
11
+ <% for attachment in attachments -%>
12
+ <p>
13
+ <%%= f.label :<%= attachment%> %><br />
14
+ <%%= f.file_field :<%= attachment%> %>
15
+ </p>
16
+ <% end -%>
17
+ <p>
18
+ <%%= f.submit 'Create' %>
19
+ </p>
20
+ <%% end %>
21
+
22
+ <%%= link_to 'Back', <%= plural_name %>_path %>
@@ -0,0 +1,17 @@
1
+ <% for attribute in attributes -%>
2
+ <p>
3
+ <b><%= attribute.column.human_name %>:</b>
4
+ <%%=h @<%= singular_name %>.<%= attribute.name %> %>
5
+ </p>
6
+
7
+ <% end -%>
8
+ <% for attachment in attachments -%>
9
+ <p>
10
+ <b><%= attachment.capitalize %>:</b>
11
+ <%%= link_to @<%= singular_name %>.<%= attachment%>_file_name, @<%= singular_name %>.<%= attachment%>.url %><br>
12
+ </p>
13
+
14
+ <% end -%>
15
+
16
+ <%%= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) %> |
17
+ <%%= link_to 'Back', <%= plural_name %>_path %>
@@ -0,0 +1,125 @@
1
+ module ViewMapper
2
+ module PaperclipView
3
+
4
+ def source_root_for_view
5
+ File.dirname(__FILE__) + "/paperclip_templates"
6
+ end
7
+
8
+ def manifest
9
+ m = super.edit do |action|
10
+ action unless is_model_dependency_action(action) || !valid
11
+ end
12
+ unless view_only? || !valid
13
+ add_model_actions(m)
14
+ end
15
+ m
16
+ end
17
+
18
+ def add_model_actions(m)
19
+ m.directory(File.join('test/fixtures', class_path))
20
+ m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
21
+ m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
22
+ unless options[:skip_fixture]
23
+ m.template 'fixtures.yml', File.join('test/fixtures', "#{table_name}.yml")
24
+ end
25
+ unless options[:skip_migration]
26
+ m.migration_template 'migration.rb',
27
+ 'db/migrate',
28
+ :assigns => { :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}" },
29
+ :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
30
+ end
31
+ end
32
+
33
+ def is_model_dependency_action(action)
34
+ action[0] == :dependency && action[1].include?('model')
35
+ end
36
+
37
+ def attachments
38
+ if view_param
39
+ parse_attachments_from_param
40
+ elsif view_only?
41
+ inspect_model_for_attachments
42
+ else
43
+ []
44
+ end
45
+ end
46
+
47
+ def parse_attachments_from_param
48
+ view_param.split(',')
49
+ end
50
+
51
+ def inspect_model_for_attachments
52
+ if model.respond_to?('attachment_definitions') && model.attachment_definitions
53
+ model.attachment_definitions.keys.collect { |name| name.to_s }.sort
54
+ else
55
+ []
56
+ end
57
+ end
58
+
59
+ def validate
60
+ @valid = validate_attachments
61
+ @valid &&= super
62
+ end
63
+
64
+ def validate_attachments
65
+ if !paperclip_installed
66
+ logger.error "The Paperclip plugin does not appear to be installed."
67
+ return false
68
+ elsif attachments == []
69
+ if view_only?
70
+ logger.warning "No paperclip attachments exist on the specified class."
71
+ else
72
+ logger.warning "No paperclip attachments specified."
73
+ end
74
+ return false
75
+ else
76
+ !attachments.detect { |a| !validate_attachment(a) }
77
+ end
78
+ end
79
+
80
+ def validate_attachment(attachment)
81
+ if view_only?
82
+ if !has_attachment(attachment.to_sym)
83
+ logger.error "Attachment '#{attachment}' does not exist."
84
+ return false
85
+ elsif !has_columns_for_attachment(attachment)
86
+ return false
87
+ end
88
+ end
89
+ true
90
+ end
91
+
92
+ def has_attachment(attachment)
93
+ model.attachment_definitions && model.attachment_definitions.has_key?(attachment)
94
+ end
95
+
96
+ def has_columns_for_attachment(attachment)
97
+ !paperclip_columns_for_attachment(attachment).detect { |paperclip_col| !has_column_for_attachment(attachment, paperclip_col) }
98
+ end
99
+
100
+ def has_column_for_attachment(attachment, paperclip_col)
101
+ has_column = model.columns.collect { |col| col.name }.include?(paperclip_col)
102
+ if !has_column
103
+ logger.error "Column \'#{paperclip_col}\' does not exist. First run script/generate paperclip #{name} #{attachment}."
104
+ end
105
+ has_column
106
+ end
107
+
108
+ def built_in_columns
109
+ attachments.inject(super) do |result, element|
110
+ result + paperclip_columns_for_attachment(element)
111
+ end
112
+ end
113
+
114
+ def paperclip_columns_for_attachment(attachment)
115
+ %w{ file_name content_type file_size updated_at }.collect do |col|
116
+ "#{attachment}_#{col}"
117
+ end
118
+ end
119
+
120
+ def paperclip_installed
121
+ ActiveRecord::Base.methods.include? 'has_attached_file'
122
+ end
123
+
124
+ end
125
+ end
@@ -23,6 +23,10 @@ module ViewMapper
23
23
  options[:view].split(':')[1]
24
24
  end
25
25
 
26
+ def view_only?
27
+ self.respond_to?(:model)
28
+ end
29
+
26
30
  def add_options!(opt)
27
31
  opt.on("--view name", String, "Specify a view to generate") do |name|
28
32
  options[:view] = name
data/lib/view_mapper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'view_mapper/auto_complete_view'
2
+ require 'view_mapper/paperclip_view'
2
3
  require 'view_mapper/route_action'
3
4
  require 'view_mapper/editable_manifest'
4
5
  require 'view_mapper/view_mapper'
@@ -12,23 +12,6 @@ class AutoCompleteViewTest < Test::Unit::TestCase
12
12
  attr_reader :file_name
13
13
  attr_reader :controller_singular_name
14
14
 
15
- def generator_cmd_line(gen, args)
16
- if gen == 'view_for'
17
- cmd_line = ['testy']
18
- else
19
- cmd_line = ['testy', 'first_name:string', 'last_name:string', 'address:string']
20
- end
21
- (cmd_line << args).flatten
22
- end
23
-
24
- def generator_script_cmd_line(gen, args)
25
- ([gen] << generator_cmd_line(gen, args)).flatten
26
- end
27
-
28
- def new_generator_for_test_model(gen, args)
29
- Rails::Generator::Base.instance(gen, generator_cmd_line(gen, args))
30
- end
31
-
32
15
  generators = %w{ view_for scaffold_for_view }
33
16
  generators.each do |gen|
34
17
 
@@ -0,0 +1,23 @@
1
+ class CreateTesties < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :testies do |t|
4
+ t.string :first_name
5
+ t.string :last_name
6
+ t.string :address
7
+ t.string :avatar_file_name
8
+ t.string :avatar_content_type
9
+ t.integer :avatar_file_size
10
+ t.datetime :avatar_updated_at
11
+ t.string :avatar2_file_name
12
+ t.string :avatar2_content_type
13
+ t.integer :avatar2_file_size
14
+ t.datetime :avatar2_updated_at
15
+
16
+ t.timestamps
17
+ end
18
+ end
19
+
20
+ def self.down
21
+ drop_table :testies
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ <h1>Editing testy</h1>
2
+
3
+ <% form_for(@testy, :html => { :multipart => true }) do |f| %>
4
+ <%= f.error_messages %>
5
+ <p>
6
+ <%= f.label :first_name %><br />
7
+ <%= f.text_field :first_name %>
8
+ </p>
9
+ <p>
10
+ <%= f.label :last_name %><br />
11
+ <%= f.text_field :last_name %>
12
+ </p>
13
+ <p>
14
+ <%= f.label :address %><br />
15
+ <%= f.text_field :address %>
16
+ </p>
17
+ <p>
18
+ <%= f.label :avatar %><br />
19
+ <%= f.file_field :avatar %>
20
+ </p>
21
+ <p>
22
+ <%= f.label :avatar2 %><br />
23
+ <%= f.file_field :avatar2 %>
24
+ </p>
25
+ <p>
26
+ <%= f.submit 'Update' %>
27
+ </p>
28
+ <% end %>
29
+
30
+ <%= link_to 'Show', @testy %> |
31
+ <%= link_to 'Back', testies_path %>