rows_controller 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +2 -0
- data/.rvmrc +3 -0
- data/.watchr +56 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +136 -0
- data/MIT-LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +30 -0
- data/app/controllers/rows_controller.rb +80 -0
- data/app/controllers/rows_controller/helpers.rb +86 -0
- data/app/views/rows/_form.html.erb +3 -0
- data/app/views/rows/_list.html.erb +31 -0
- data/app/views/rows/_submit.html.erb +22 -0
- data/app/views/rows/_submit_part.html.erb +4 -0
- data/app/views/rows/destroy.js.erb +1 -0
- data/app/views/rows/edit.html.erb +22 -0
- data/app/views/rows/index.html.erb +20 -0
- data/app/views/rows/new.html.erb +22 -0
- data/app/views/rows/show.html.erb +25 -0
- data/app/views/shared/_error_explanation.html.erb +14 -0
- data/app/views/shared/_flash.html.erb +9 -0
- data/lib/rows_controller.rb +5 -0
- data/lib/rows_controller/engine.rb +4 -0
- data/lib/rows_controller/locales/en.yml +33 -0
- data/lib/rows_controller/version.rb +3 -0
- data/rows_controller.gemspec +27 -0
- data/spec/controllers/orders_spec.rb +65 -0
- data/spec/controllers/rows_spec.rb +19 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/orders_controller.rb +3 -0
- data/spec/dummy/app/models/order.rb +10 -0
- data/spec/dummy/app/views/layouts/application.html.erb +13 -0
- data/spec/dummy/app/views/orders/_form.html.erb +12 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +49 -0
- data/spec/dummy/config/boot.rb +9 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +60 -0
- data/spec/dummy/config/environments/test.rb +40 -0
- data/spec/dummy/config/initializers/secret_token.rb +1 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/routes.rb +7 -0
- data/spec/dummy/db/migrate/001_create_orders.rb +10 -0
- data/spec/dummy/db/schema.rb +23 -0
- data/spec/dummy/db/seeds.rb +7 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/integration/order_spec.rb +45 -0
- data/spec/models/order_spec.rb +7 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/support/describe_private.rb +14 -0
- metadata +164 -0
@@ -0,0 +1,86 @@
|
|
1
|
+
class RowsController < ApplicationController
|
2
|
+
|
3
|
+
def self.model_class(model_class = nil)
|
4
|
+
@model_class = model_class unless model_class.nil?
|
5
|
+
@model_class
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
protected
|
10
|
+
DATE_FORMAT = '%d.%m.%Y'
|
11
|
+
|
12
|
+
helper_method :resource, :resources, :columns,
|
13
|
+
:model_class, :model_name, :model_symbol, :model_symbol_plural,
|
14
|
+
:resources_format
|
15
|
+
|
16
|
+
def resource
|
17
|
+
return @_resource if @_resource
|
18
|
+
|
19
|
+
self.resource = begin
|
20
|
+
name = model_symbol
|
21
|
+
if id = params["#{name}_id"] || params[:id]
|
22
|
+
model_class.find_by_id(id).tap do |r|
|
23
|
+
r.attributes = params[name] unless request.get?
|
24
|
+
end
|
25
|
+
else
|
26
|
+
model_class.new(params[name])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource=(value)
|
32
|
+
@_resource = value
|
33
|
+
instance_variable_set("@#{model_symbol}", value)
|
34
|
+
value
|
35
|
+
end
|
36
|
+
|
37
|
+
def resources
|
38
|
+
return @_resources if @_resources
|
39
|
+
self.resources = model_class.all
|
40
|
+
end
|
41
|
+
|
42
|
+
def resources=(value)
|
43
|
+
@_resources = value
|
44
|
+
instance_variable_set("@#{model_symbol_plural}", value)
|
45
|
+
value
|
46
|
+
end
|
47
|
+
|
48
|
+
def model_class
|
49
|
+
@model_class ||= self.class.model_class ||
|
50
|
+
params[:controller].singularize.camelize.constantize
|
51
|
+
end
|
52
|
+
|
53
|
+
def model_name
|
54
|
+
@_model_name ||= model_class.name
|
55
|
+
end
|
56
|
+
|
57
|
+
def model_symbol
|
58
|
+
@_model_symbol ||= model_name.underscore
|
59
|
+
end
|
60
|
+
|
61
|
+
def model_symbol_plural
|
62
|
+
@_model_symbol_plural ||= model_name.pluralize.underscore
|
63
|
+
end
|
64
|
+
|
65
|
+
def columns
|
66
|
+
return model_class.column_headers if model_class.respond_to?(:column_headers)
|
67
|
+
return ['to_s'] unless model_class.respond_to?(:content_columns)
|
68
|
+
['id'] + model_class.content_columns.collect{|c| c.name }
|
69
|
+
end
|
70
|
+
|
71
|
+
def resources_format(x)
|
72
|
+
x = '' if x.nil?
|
73
|
+
bool = x.class == Time || x.class == Date || x.class == DateTime ||
|
74
|
+
x.class == ActiveSupport::TimeWithZone
|
75
|
+
return x.strftime(DATE_FORMAT) if bool
|
76
|
+
return x.to_s if x.class == Fixnum
|
77
|
+
return 'X' if x.class == TrueClass
|
78
|
+
return ' ' if x.class == FalseClass
|
79
|
+
return x.call if x.class == Proc
|
80
|
+
return '---' if x.empty?
|
81
|
+
str = x.to_s
|
82
|
+
## str = UTF8FY.iconv(x.to_s) if APPLICATION_OPTIONS[:customization] == :dk
|
83
|
+
return str.gsub(/\r*\n/, '<br/>')
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%
|
2
|
+
# Requires resources model_class columns
|
3
|
+
# /home/dk/docu/app/views/restful/_list.html.erb
|
4
|
+
|
5
|
+
cnt = 0
|
6
|
+
%>
|
7
|
+
|
8
|
+
<table class="rows-list">
|
9
|
+
<tr>
|
10
|
+
<% columns.each do |column| %>
|
11
|
+
<th> <%= t("header.#{column}", :default => column) %> </th>
|
12
|
+
<% end %>
|
13
|
+
</tr>
|
14
|
+
<% resources.each do |resource|
|
15
|
+
url = "/#{controller_name}/#{resource.id}"
|
16
|
+
cnt += 1
|
17
|
+
%>
|
18
|
+
<tr id="row_<%= resource.id%>" class="<%= %w{odd even}.at(cnt % 2) %>" >
|
19
|
+
<% columns.each do |column| %>
|
20
|
+
<td> <%= resources_format(resource.send(column)) %> </td>
|
21
|
+
<% end %>
|
22
|
+
<td>
|
23
|
+
<%= link_to t('button.show', :default => 'Show'), url %>
|
24
|
+
<%= link_to t('button.edit', :default => 'Edit'), url + '/edit' %>
|
25
|
+
<%= link_to t('button.delete', :default => 'Delete'), url,
|
26
|
+
:remote => true,
|
27
|
+
:confirm => 'Are you sure?', :method => :delete %>
|
28
|
+
</td>
|
29
|
+
</tr>
|
30
|
+
<% end %>
|
31
|
+
</table>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%
|
2
|
+
# submit links and/or buttons
|
3
|
+
# Requires
|
4
|
+
# content_for(:submit_<left|right>)
|
5
|
+
# left|right (links names)
|
6
|
+
|
7
|
+
# left|right must be used inside a form.
|
8
|
+
# The clean content_for variant may be used unbounded.
|
9
|
+
|
10
|
+
left ||= nil
|
11
|
+
right ||= nil
|
12
|
+
%>
|
13
|
+
<div class="rows_submit" style="width:100%">
|
14
|
+
<input style="display:none" type="submit" name="commit" value="OK" />
|
15
|
+
<p style="float:left">
|
16
|
+
<%= render '/rows/submit_part', :content => :submit_left, :names => left %>
|
17
|
+
</p>
|
18
|
+
<p style="float:right">
|
19
|
+
<%= render '/rows/submit_part', :content => :submit_right, :names => right %>
|
20
|
+
</p>
|
21
|
+
<div style="clear:both"> </div>
|
22
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
$('#row_<%= resource.id %>').fadeOut(500, function() { $(this).remove(); });
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%
|
2
|
+
# Template for RowsController (edit)
|
3
|
+
# Requires resource model_name model_symbol
|
4
|
+
# partial 'form' template
|
5
|
+
|
6
|
+
content_for(:submit_left) { link_to t('button.back', :default => 'Back'),
|
7
|
+
"/#{controller_name}" }
|
8
|
+
%>
|
9
|
+
|
10
|
+
<%= render '/shared/error_explanation' %>
|
11
|
+
|
12
|
+
<fieldset class="wide mask" id="<%= model_symbol %>">
|
13
|
+
<legend>
|
14
|
+
<%= t('ui.edit', :model => model_name,
|
15
|
+
:default => 'Edit %{model}') %>
|
16
|
+
</legend>
|
17
|
+
<%= form_for resource do |f| %>
|
18
|
+
<%= render 'form', :f => f %>
|
19
|
+
<%= render '/rows/submit',
|
20
|
+
:right => [t('ui.update', :default => 'Update')] %>
|
21
|
+
<% end %>
|
22
|
+
</fieldset>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%
|
2
|
+
# /home/dk/docu/app/views/restful/index.html.erb
|
3
|
+
|
4
|
+
# Template for RestfulController (index)
|
5
|
+
# Requires resources model_name
|
6
|
+
|
7
|
+
if resources.length > 0
|
8
|
+
%>
|
9
|
+
<h1> <%= t('ui.listing', :model => model_name,
|
10
|
+
:default => 'Listing %{model}') %></h1>
|
11
|
+
<%= render '/shared/error_explanation' %>
|
12
|
+
<%= render '/rows/list', :resources => resources %>
|
13
|
+
<% else %>
|
14
|
+
<h1> <%= t('ui.empty_list', :model => model_name,
|
15
|
+
:default => 'List %{model} is empty') %></h1>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<br/>
|
19
|
+
<%= link_to t('ui.create', :default => 'Create'),
|
20
|
+
url_for(:action => :new) %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%
|
2
|
+
# Template for RowsController (new)
|
3
|
+
# Requires resource model_name model_symbol
|
4
|
+
# partial 'form' template
|
5
|
+
|
6
|
+
content_for(:submit_left) { link_to t('button.back', :default => 'Back'),
|
7
|
+
"/#{controller_name}" }
|
8
|
+
%>
|
9
|
+
|
10
|
+
<%= render '/shared/error_explanation' %>
|
11
|
+
|
12
|
+
<fieldset class="wide mask" id="<%= model_symbol %>">
|
13
|
+
<legend>
|
14
|
+
<%= t('ui.new', :model => model_name,
|
15
|
+
:default => 'New %{model}') %>
|
16
|
+
</legend>
|
17
|
+
<%= form_for resource do |f| %>
|
18
|
+
<%= render 'form', :f => f %>
|
19
|
+
<%= render '/rows/submit',
|
20
|
+
:right => [t('ui.create', :default => 'Create')] %>
|
21
|
+
<% end %>
|
22
|
+
</fieldset>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<%
|
2
|
+
# /home/dk/docu/app/views/restful/show.html.erb
|
3
|
+
# Template for RowsController (show)
|
4
|
+
# Requires resource model_name model_symbol
|
5
|
+
# partial 'form' template
|
6
|
+
|
7
|
+
content_for(:submit_left) { link_to t('button.edit', :default => 'Edit'),
|
8
|
+
url_for(:action => :edit) }
|
9
|
+
content_for(:submit_left) { ' | ' }
|
10
|
+
content_for(:submit_left) { link_to t('button.back', :default => 'Back'),
|
11
|
+
url_for(:action => :index) }
|
12
|
+
%>
|
13
|
+
|
14
|
+
<%= render '/shared/error_explanation' %>
|
15
|
+
|
16
|
+
<fieldset class="show wide mask" id="<%= model_symbol %>" >
|
17
|
+
<legend>
|
18
|
+
<%= t('ui.show', :model => model_name,
|
19
|
+
:default => 'Show %{model}') %>
|
20
|
+
</legend>
|
21
|
+
<%= form_for resource do |f| %>
|
22
|
+
<%= render 'form', :f => f %>
|
23
|
+
<%= render '/rows/submit' %>
|
24
|
+
<% end %>
|
25
|
+
</fieldset>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%
|
2
|
+
# Requires resource
|
3
|
+
%>
|
4
|
+
<% if resource && resource.respond_to?(:errors) && resource.errors.any? %>
|
5
|
+
<div id="error_explanation">
|
6
|
+
<h2><%= pluralize(resource.errors.count, "error") %> prohibited this template from being saved:</h2>
|
7
|
+
|
8
|
+
<ul>
|
9
|
+
<% resource.errors.full_messages.each do |msg| %>
|
10
|
+
<li><%= msg %></li>
|
11
|
+
<% end %>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
en:
|
2
|
+
flash:
|
3
|
+
actions:
|
4
|
+
create:
|
5
|
+
notice: "%{resource_name} was successfully created."
|
6
|
+
alert: ""
|
7
|
+
update:
|
8
|
+
notice: "%{resource_name} was successfully updated."
|
9
|
+
alert: ""
|
10
|
+
destroy:
|
11
|
+
notice: "%{resource_name} was successfully destroyed."
|
12
|
+
alert: "%{resource_name} could not be destroyed."
|
13
|
+
|
14
|
+
ui:
|
15
|
+
created: '%{model} created.'
|
16
|
+
deleted: '%{model} deleted.'
|
17
|
+
empty_list: 'List %{model} is empty'
|
18
|
+
listing: 'Listing %{model}'
|
19
|
+
new: 'New %{model}'
|
20
|
+
show: 'Show %{model}'
|
21
|
+
updated: '%{model} updated.'
|
22
|
+
|
23
|
+
create: 'Create'
|
24
|
+
update: 'Update'
|
25
|
+
|
26
|
+
button:
|
27
|
+
back: 'Back'
|
28
|
+
edit: 'Edit'
|
29
|
+
delete: 'Delete'
|
30
|
+
show: 'Show'
|
31
|
+
|
32
|
+
header:
|
33
|
+
# to_s: 'Test'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
lib = File.expand_path('../lib/', __FILE__)
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
require 'rows_controller/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "rows_controller"
|
8
|
+
s.version = Rows::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.summary = "Rows DRYs your controllers."
|
11
|
+
s.description = "YourController < RowsController ( < ApplicationController)."
|
12
|
+
s.authors = ['Dittmar Krall']
|
13
|
+
s.email = ['dittmar.krall@matique.de']
|
14
|
+
s.homepage = 'http://matique.de'
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
# specify any dependencies here; for example:
|
21
|
+
# s.add_development_dependency "rspec"
|
22
|
+
# s.add_runtime_dependency "rest-client"
|
23
|
+
|
24
|
+
s.add_development_dependency "sqlite3" # for testing
|
25
|
+
s.add_development_dependency "rspec-rails"
|
26
|
+
s.add_development_dependency "capybara"
|
27
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OrdersController, ':' do
|
4
|
+
Order.delete_all
|
5
|
+
Order.create :name => 'name', :qty => 123
|
6
|
+
let(:order) {Order.all.first}
|
7
|
+
|
8
|
+
%w{index new}.each do |action|
|
9
|
+
describe "#{action}" do
|
10
|
+
it "renders the '#{action}' template" do
|
11
|
+
get action.to_sym
|
12
|
+
response.code.should eq('200')
|
13
|
+
response.should render_template("rows/#{action}")
|
14
|
+
response.body.should == ''
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
%w{edit show}.each do |action|
|
20
|
+
describe "#{action}" do
|
21
|
+
it "renders the '#{action}' template" do
|
22
|
+
get action.to_sym, :id => order.id
|
23
|
+
response.code.should eq('200')
|
24
|
+
response.should render_template("rows/#{action}")
|
25
|
+
response.body.should == ''
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'checking resource' do
|
31
|
+
get :show, :id => order.id
|
32
|
+
subject.send(:resource).should == order
|
33
|
+
assigns(:order).should == order
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'checking resources' do
|
37
|
+
get :index
|
38
|
+
subject.send(:resources).should be_a_kind_of(Array)
|
39
|
+
assigns(:orders).should be_a_kind_of(Array)
|
40
|
+
assigns(:orders).should == Order.all
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'checking model_class' do
|
44
|
+
get :show, :id => order.id
|
45
|
+
subject.send(:model_class).should == Order
|
46
|
+
subject.send(:model_name).should == 'Order'
|
47
|
+
subject.send(:model_symbol).should == 'order'
|
48
|
+
subject.send(:model_symbol_plural).should == 'orders'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
class CategoriesController < RowsController
|
54
|
+
model_class Order
|
55
|
+
end
|
56
|
+
|
57
|
+
describe CategoriesController do
|
58
|
+
it 'checking model_class' do
|
59
|
+
get :index
|
60
|
+
subject.send(:model_class).should == Order
|
61
|
+
subject.send(:model_name).should == 'Order'
|
62
|
+
subject.send(:model_symbol).should == 'order'
|
63
|
+
subject.send(:model_symbol_plural).should == 'orders'
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RowsController do
|
4
|
+
specify { should respond_to(:resource) }
|
5
|
+
specify { should respond_to(:resources) }
|
6
|
+
specify { should respond_to(:model_class) }
|
7
|
+
specify { should respond_to(:model_name) }
|
8
|
+
specify { should respond_to(:model_symbol) }
|
9
|
+
specify { should respond_to(:model_symbol_plural) }
|
10
|
+
specify { should respond_to(:resources_format) }
|
11
|
+
|
12
|
+
specify { should respond_to(:index) }
|
13
|
+
specify { should respond_to(:show) }
|
14
|
+
specify { should respond_to(:new) }
|
15
|
+
specify { should respond_to(:edit) }
|
16
|
+
specify { should respond_to(:create) }
|
17
|
+
specify { should respond_to(:update) }
|
18
|
+
specify { should respond_to(:destroy) }
|
19
|
+
end
|