dynamic_controller 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gitignore +4 -4
  2. data/Gemfile +4 -4
  3. data/README.md +39 -2
  4. data/Rakefile +1 -1
  5. data/dynamic_controller.gemspec +26 -26
  6. data/lib/dynamic_controller/class_methods.rb +48 -0
  7. data/lib/dynamic_controller/helper_methods.rb +59 -0
  8. data/lib/dynamic_controller/instance_methods.rb +127 -0
  9. data/lib/dynamic_controller/resource.rb +21 -0
  10. data/lib/dynamic_controller/responder.rb +71 -0
  11. data/lib/dynamic_controller/version.rb +3 -3
  12. data/lib/dynamic_controller.rb +12 -180
  13. data/spec/controller_factory.rb +15 -0
  14. data/spec/controllers/crud_actions_json_spec.rb +3 -3
  15. data/spec/controllers/nested_crud_actions_html_spec.rb +9 -8
  16. data/spec/controllers/nested_crud_actions_json_spec.rb +11 -11
  17. data/spec/controllers/redefined_responders_html_spec.rb +112 -0
  18. data/spec/controllers/redefined_responders_json_spec.rb +95 -0
  19. data/spec/controllers/two_level_nested_crud_actions_html_spec.rb +134 -0
  20. data/spec/controllers/two_level_nested_crud_actions_json_spec.rb +98 -0
  21. data/spec/dummy/.gitignore +15 -15
  22. data/spec/dummy/Gemfile +12 -12
  23. data/spec/dummy/README.rdoc +261 -261
  24. data/spec/dummy/Rakefile +7 -7
  25. data/spec/dummy/app/assets/javascripts/application.js +15 -15
  26. data/spec/dummy/app/assets/stylesheets/application.css +13 -13
  27. data/spec/dummy/app/assets/stylesheets/scaffolds.css.scss +69 -69
  28. data/spec/dummy/app/controllers/application_controller.rb +3 -3
  29. data/spec/dummy/app/controllers/cities_controller.rb +95 -94
  30. data/spec/dummy/app/controllers/countries_controller.rb +86 -86
  31. data/spec/dummy/app/controllers/languages_controller.rb +95 -0
  32. data/spec/dummy/app/controllers/streets_controller.rb +97 -0
  33. data/spec/dummy/app/helpers/application_helper.rb +2 -2
  34. data/spec/dummy/app/models/city.rb +6 -5
  35. data/spec/dummy/app/models/country.rb +5 -5
  36. data/spec/dummy/app/models/language.rb +4 -0
  37. data/spec/dummy/app/models/street.rb +5 -0
  38. data/spec/dummy/app/views/cities/_form.html.erb +25 -25
  39. data/spec/dummy/app/views/cities/edit.html.erb +6 -6
  40. data/spec/dummy/app/views/cities/index.html.erb +29 -25
  41. data/spec/dummy/app/views/cities/new.html.erb +5 -5
  42. data/spec/dummy/app/views/cities/show.html.erb +15 -15
  43. data/spec/dummy/app/views/countries/_form.html.erb +21 -21
  44. data/spec/dummy/app/views/countries/edit.html.erb +6 -6
  45. data/spec/dummy/app/views/countries/index.html.erb +25 -23
  46. data/spec/dummy/app/views/countries/new.html.erb +5 -5
  47. data/spec/dummy/app/views/countries/show.html.erb +10 -10
  48. data/spec/dummy/app/views/languages/_form.html.erb +21 -0
  49. data/spec/dummy/app/views/languages/edit.html.erb +6 -0
  50. data/spec/dummy/app/views/languages/index.html.erb +23 -0
  51. data/spec/dummy/app/views/languages/new.html.erb +5 -0
  52. data/spec/dummy/app/views/languages/show.html.erb +10 -0
  53. data/spec/dummy/app/views/layouts/application.html.erb +14 -14
  54. data/spec/dummy/app/views/streets/_form.html.erb +25 -0
  55. data/spec/dummy/app/views/streets/edit.html.erb +6 -0
  56. data/spec/dummy/app/views/streets/index.html.erb +27 -0
  57. data/spec/dummy/app/views/streets/new.html.erb +5 -0
  58. data/spec/dummy/app/views/streets/show.html.erb +15 -0
  59. data/spec/dummy/config/application.rb +62 -62
  60. data/spec/dummy/config/boot.rb +6 -6
  61. data/spec/dummy/config/database.yml +25 -25
  62. data/spec/dummy/config/environment.rb +5 -5
  63. data/spec/dummy/config/environments/development.rb +37 -37
  64. data/spec/dummy/config/environments/production.rb +67 -67
  65. data/spec/dummy/config/environments/test.rb +37 -37
  66. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -7
  67. data/spec/dummy/config/initializers/inflections.rb +15 -15
  68. data/spec/dummy/config/initializers/mime_types.rb +5 -5
  69. data/spec/dummy/config/initializers/secret_token.rb +7 -7
  70. data/spec/dummy/config/initializers/session_store.rb +8 -8
  71. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -14
  72. data/spec/dummy/config/locales/en.yml +5 -5
  73. data/spec/dummy/config/routes.rb +8 -5
  74. data/spec/dummy/config.ru +4 -4
  75. data/spec/dummy/db/migrate/20120907174827_create_countries.rb +9 -9
  76. data/spec/dummy/db/migrate/20120907230842_create_cities.rb +11 -11
  77. data/spec/dummy/db/migrate/20120922010743_create_languages.rb +9 -0
  78. data/spec/dummy/db/migrate/20120929185302_create_streets.rb +11 -0
  79. data/spec/dummy/db/schema.rb +16 -1
  80. data/spec/dummy/db/seeds.rb +7 -7
  81. data/spec/dummy/doc/README_FOR_APP +2 -2
  82. data/spec/dummy/public/404.html +26 -26
  83. data/spec/dummy/public/422.html +26 -26
  84. data/spec/dummy/public/500.html +25 -25
  85. data/spec/dummy/public/index.html +241 -241
  86. data/spec/dummy/public/robots.txt +5 -5
  87. data/spec/dummy/script/rails +6 -6
  88. data/spec/factories.rb +9 -0
  89. data/spec/has_crud_actions_options_spec.rb +49 -0
  90. data/spec/spec_helper.rb +1 -0
  91. metadata +43 -16
data/.gitignore CHANGED
@@ -1,5 +1,5 @@
1
- *.gem
2
- .bundle
3
- Gemfile.lock
4
- pkg/*
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
5
  .idea
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in dynamic_controller.gemspec
4
- gemspec
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dynamic_controller.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DynamicController
2
2
 
3
- Simple way to add CRUD actions to Rails controllers.
3
+ Simple way to add CRUD actions into Rails controllers.
4
4
 
5
5
  Suppoted formats HTML and JSON.
6
6
 
@@ -28,10 +28,47 @@ Or install it yourself as:
28
28
 
29
29
  has_crud_actions adds index, show, new, edit, create, update and destroy actions to controller
30
30
 
31
+ ## Explicit action specification
32
+
33
+ class UsersController < ApplicationController
34
+ has_crud_actions only: [:index, :new, :create]
35
+ end
36
+
37
+ or
38
+
39
+ class UsersController < ApplicationController
40
+ has_crud_actions except: :destroy
41
+ end
42
+
43
+
31
44
  ## Nested resources support
32
45
 
33
46
  class ProfilesController < ApplicationController
34
- has_crud_actions nested_of: User
47
+ has_crud_actions
48
+ nested_of: User
49
+ end
50
+
51
+ If has more than one nested level should use
52
+
53
+ class StreetsController < ApplicationController
54
+ has_crud_actions
55
+ nested_of: Country
56
+ nested_of: City
57
+ end
58
+
59
+ ## Redefining responder
60
+
61
+ class LanguagesController < ApplicationController
62
+ has_crud_actions
63
+
64
+ respond_to_create :html do
65
+ redirect_to action: :index
66
+ end
67
+
68
+ respond_to_update do |format|
69
+ format.html { redirect_to action: :index }
70
+ format.json { render json: @language }
71
+ end
35
72
  end
36
73
 
37
74
  ## Contributing
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require "bundler/gem_tasks"
@@ -1,26 +1,26 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "dynamic_controller/version"
4
-
5
- Gem::Specification.new do |s|
6
- s.name = 'dynamic_controller'
7
- s.version = DynamicController::VERSION
8
- s.authors = ['Gabriel Naiman']
9
- s.email = ['gabynaiman@gmail.com']
10
- s.homepage = 'https://github.com/gabynaiman/dynamic_controller'
11
- s.summary = 'Simple way to add CRUD actions to Rails controllers'
12
- s.description = 'Simple way to add CRUD actions to Rails controllers'
13
-
14
- s.files = `git ls-files`.split("\n")
15
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
- s.require_paths = ["lib"]
18
-
19
- s.add_dependency 'ransack'
20
- s.add_dependency 'kaminari'
21
-
22
- s.add_development_dependency 'rails'
23
- s.add_development_dependency 'sqlite3'
24
- s.add_development_dependency 'rspec-rails'
25
- s.add_development_dependency 'factory_girl_rails'
26
- end
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "dynamic_controller/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'dynamic_controller'
7
+ s.version = DynamicController::VERSION
8
+ s.authors = ['Gabriel Naiman']
9
+ s.email = ['gabynaiman@gmail.com']
10
+ s.homepage = 'https://github.com/gabynaiman/dynamic_controller'
11
+ s.summary = 'Simple way to add CRUD actions into Rails controllers'
12
+ s.description = 'Simple way to add CRUD actions into Rails controllers'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency 'ransack'
20
+ s.add_dependency 'kaminari'
21
+
22
+ s.add_development_dependency 'rails'
23
+ s.add_development_dependency 'sqlite3'
24
+ s.add_development_dependency 'rspec-rails'
25
+ s.add_development_dependency 'factory_girl_rails'
26
+ end
@@ -0,0 +1,48 @@
1
+ module DynamicController
2
+ module ClassMethods
3
+ ACTIONS = [:index, :show, :new, :create, :edit, :update, :destroy]
4
+
5
+ def has_crud_actions(options={})
6
+ @resource_options = Hash[options.map { |k, v| [:only, :except].include?(k.to_sym) ? [k, [v].flatten.map(&:to_sym)] : [k, v] }].reverse_merge(only: ACTIONS, except: [])
7
+ send :include, InstanceMethods
8
+ end
9
+
10
+ def nested_of(resource_class)
11
+ before_filter :load_parent_models if parent_resources.empty?
12
+ self.parent_resources << Resource.new(resource_class: resource_class)
13
+ end
14
+
15
+ def parent_resources
16
+ @parent_resources ||= []
17
+ end
18
+
19
+ def include_action?(action_name)
20
+ (@resource_options[:only] - @resource_options[:except]).include?(action_name)
21
+ end
22
+
23
+ def redefined_responders
24
+ @redefined_responders ||= {}
25
+ end
26
+
27
+ def redefined_responder_to(action, format=nil)
28
+ redefined_responders[redefined_responder_key(action, format)]
29
+ end
30
+
31
+ def redefined_responder_to?(action, format=nil)
32
+ redefined_responders.has_key? redefined_responder_key(action, format)
33
+ end
34
+
35
+ ACTIONS.each do |action|
36
+ define_method "respond_to_#{action}" do |format=nil, &block|
37
+ redefined_responders[redefined_responder_key(action, format)] = block
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def redefined_responder_key(action, format=nil)
44
+ [action, format].compact.join('_').to_sym
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,59 @@
1
+ module DynamicController
2
+ module HelperMethods
3
+
4
+ def resource_class
5
+ @resource_class ||= (resource_namespace.to_s.split('::') << controller_name.classify).join('::').constantize
6
+ end
7
+
8
+ def resource_namespace
9
+ self.class.to_s.deconstantize.constantize
10
+ end
11
+
12
+ def collection=(value)
13
+ instance_variable_set("@#{controller_name}", value)
14
+ end
15
+
16
+ def collection
17
+ instance_variable_get("@#{controller_name}")
18
+ end
19
+
20
+ def model=(value)
21
+ instance_variable_set("@#{controller_name.singularize}", value)
22
+ end
23
+
24
+ def model
25
+ instance_variable_get("@#{controller_name.singularize}")
26
+ end
27
+
28
+ def load_parent_models
29
+ parent = nil
30
+ self.class.parent_resources.each do |resource|
31
+ if parent
32
+ parent = parent.send(resource.children_name).find(params[resource.param_name])
33
+ else
34
+ parent = resource.find params[resource.param_name]
35
+ end
36
+ instance_variable_set resource.instance_variable_name, parent
37
+ end
38
+ end
39
+
40
+ def parent_models
41
+ return nil if self.class.parent_resources.empty?
42
+ self.class.parent_resources.map do |resource|
43
+ instance_variable_get resource.instance_variable_name
44
+ end
45
+ end
46
+
47
+ def parent_model
48
+ (parent_models || []).last
49
+ end
50
+
51
+ def handle_error(error)
52
+ respond_to do |format|
53
+ format.html { raise error }
54
+ format.json { render json: error.message, status: :internal_server_error }
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,127 @@
1
+ module DynamicController
2
+ module InstanceMethods
3
+
4
+ def self.included(base)
5
+ base.send :include, HelperMethods
6
+ base.rescue_from StandardError, with: :handle_error
7
+
8
+ if base.include_action?(:index)
9
+ base.send :define_method, :index do
10
+ if parent_model
11
+ self.collection = parent_model.send(controller_name).search(params[:q]).result.page(params[:page])
12
+ else
13
+ self.collection = resource_class.search(params[:q]).result.page(params[:page])
14
+ end
15
+
16
+ Responder.new(self).index
17
+ end
18
+ end
19
+
20
+ if base.include_action?(:show)
21
+ base.send :define_method, :show do
22
+ if parent_model
23
+ self.model = parent_model.send(controller_name).find(params[:id])
24
+ else
25
+ self.model = resource_class.find(params[:id])
26
+ end
27
+
28
+ Responder.new(self).show
29
+ end
30
+ end
31
+
32
+ if base.include_action?(:new)
33
+ base.send :define_method, :new do
34
+ if parent_model
35
+ self.model = parent_model.send(controller_name).build
36
+ else
37
+ self.model = resource_class.new
38
+ end
39
+
40
+ Responder.new(self).new
41
+ end
42
+ end
43
+
44
+ if base.include_action?(:edit)
45
+ base.send :define_method, :edit do
46
+ if parent_model
47
+ self.model = parent_model.send(controller_name).find(params[:id])
48
+ else
49
+ self.model = resource_class.find(params[:id])
50
+ end
51
+
52
+ Responder.new(self).edit
53
+ end
54
+ end
55
+
56
+ if base.include_action?(:create)
57
+ base.send :define_method, :create do
58
+ if parent_model
59
+ self.model = parent_model.send(controller_name).build(params[controller_name.singularize])
60
+ else
61
+ self.model = resource_class.new(params[controller_name.singularize])
62
+ end
63
+
64
+ if model.save
65
+ flash_message = "#{resource_class.model_name.human} successfully created"
66
+ if params[:save_and_new]
67
+ flash[:success] = flash_message
68
+ redirect_to action: :new
69
+ else
70
+ flash.now[:success] = flash_message
71
+ Responder.new(self).create
72
+ end
73
+ else
74
+ respond_to do |format|
75
+ format.html { render :new }
76
+ format.json { render json: model.errors, status: :unprocessable_entity }
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ if base.include_action?(:update)
83
+ base.send :define_method, :update do
84
+ if parent_model
85
+ self.model = parent_model.send(controller_name).find(params[:id])
86
+ else
87
+ self.model = resource_class.find(params[:id])
88
+ end
89
+
90
+ if model.update_attributes(params[controller_name.singularize])
91
+ flash.now[:success] = "#{resource_class.model_name.human} successfully updated"
92
+ Responder.new(self).update
93
+ else
94
+ respond_to do |format|
95
+ format.html { render :edit }
96
+ format.json { render json: model.errors, status: :unprocessable_entity }
97
+ end
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ if base.include_action?(:destroy)
104
+ base.send :define_method, :destroy do
105
+ if parent_model
106
+ self.model = parent_model.send(controller_name).find(params[:id])
107
+ else
108
+ self.model = resource_class.find(params[:id])
109
+ end
110
+
111
+ if model.destroy
112
+ flash[:warning] = "#{resource_class.model_name.human} successfully removed"
113
+ Responder.new(self).destroy
114
+ else
115
+ flash[:danger] = "#{resource_class.model_name.human} could not be deleted"
116
+ respond_to do |format|
117
+ format.html { redirect_to action: :index }
118
+ format.json { render json: model.errors, status: :unprocessable_entity }
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ end
125
+
126
+ end
127
+ end
@@ -0,0 +1,21 @@
1
+ module DynamicController
2
+ class Resource
3
+ attr_reader :resource_class,
4
+ :param_name,
5
+ :instance_variable_name,
6
+ :children_name
7
+
8
+ def initialize(options={})
9
+ raise 'Param resource_class must be a class' if !options.has_key?(:resource_class) || !options[:resource_class].is_a?(Class)
10
+ @resource_class = options[:resource_class]
11
+ @param_name = options[:param_name] || "#{resource_class.to_s.demodulize.underscore}_id"
12
+ @instance_variable_name = options[:instance_variable_name] || "@#{resource_class.to_s.demodulize.underscore}"
13
+ @children_name = options[:children_name] || resource_class.to_s.demodulize.pluralize.underscore
14
+ end
15
+
16
+ def find(id)
17
+ resource_class.find(id)
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,71 @@
1
+ module DynamicController
2
+ class Responder
3
+
4
+ def initialize(controller)
5
+ @controller = controller
6
+ end
7
+
8
+ def index
9
+ action :index,
10
+ html: Proc.new {},
11
+ json: Proc.new { render json: collection }
12
+ end
13
+
14
+ def show
15
+ action :show,
16
+ html: Proc.new {},
17
+ json: Proc.new { render json: model }
18
+ end
19
+
20
+ def new
21
+ action :new,
22
+ html: Proc.new {}
23
+ end
24
+
25
+ def edit
26
+ action :edit,
27
+ html: Proc.new {}
28
+ end
29
+
30
+ def create
31
+ action :create,
32
+ html: Proc.new { redirect_to action: :show, id: model.id },
33
+ json: Proc.new { render json: model, status: :created }
34
+ end
35
+
36
+ def update
37
+ action :update,
38
+ html: Proc.new { redirect_to action: :show, id: model.id },
39
+ json: Proc.new { head :no_content }
40
+ end
41
+
42
+ def destroy
43
+ action :destroy,
44
+ html: Proc.new { redirect_to action: :index },
45
+ json: Proc.new { head :no_content }
46
+ end
47
+
48
+ private
49
+
50
+ def action(name, blocks={})
51
+ @controller.instance_eval do
52
+ if self.class.redefined_responder_to?(name)
53
+ respond_to do |format|
54
+ self.instance_exec format, &self.class.redefined_responder_to(name)
55
+ end
56
+ else
57
+ respond_to do |format|
58
+ [:html, :json].each do |mime|
59
+ if self.class.redefined_responder_to?(name, mime)
60
+ format.send(mime) { self.instance_eval &self.class.redefined_responder_to(name, mime) }
61
+ elsif blocks[mime]
62
+ format.send(mime) { self.instance_eval &blocks[mime] }
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -1,3 +1,3 @@
1
- module DynamicController
2
- VERSION = "0.0.1"
3
- end
1
+ module DynamicController
2
+ VERSION = "0.0.2"
3
+ end
@@ -1,180 +1,12 @@
1
- require 'dynamic_controller/version'
2
- require 'ransack'
3
- require 'kaminari'
4
-
5
- module DynamicController
6
-
7
- module ClassMethods
8
-
9
- attr_reader :dynamic_options
10
-
11
- def has_crud_actions(options={})
12
- send :include, CrudActions
13
- before_filter :load_nested if options[:nested_of]
14
- @dynamic_options = options
15
- end
16
-
17
- end
18
-
19
- module CrudActions
20
-
21
- def self.included(base)
22
- base.helper_method [:resource_class, :controller_namespace]
23
- base.respond_to :html, :json
24
- base.rescue_from StandardError, with: :handle_error
25
- end
26
-
27
- def index
28
- if parent_model
29
- self.collection = parent_model.send(controller_name).search(params[:q]).result.page(params[:page])
30
- else
31
- self.collection = resource_class.search(params[:q]).result.page(params[:page])
32
- end
33
-
34
- respond_with collection
35
- end
36
-
37
- def show
38
- if parent_model
39
- self.model = parent_model.send(controller_name).find(params[:id])
40
- else
41
- self.model = resource_class.find(params[:id])
42
- end
43
-
44
- respond_with model
45
- end
46
-
47
- def new
48
- if parent_model
49
- self.model = parent_model.send(controller_name).build
50
- else
51
- self.model = resource_class.new
52
- end
53
- end
54
-
55
- def edit
56
- if parent_model
57
- self.model = parent_model.send(controller_name).find(params[:id])
58
- else
59
- self.model = resource_class.find(params[:id])
60
- end
61
- end
62
-
63
- def create
64
- if parent_model
65
- self.model = parent_model.send(controller_name).build(params[resource_class.model_name.underscore])
66
- else
67
- self.model = resource_class.new(params[resource_class.model_name.underscore])
68
- end
69
-
70
- if model.save
71
- flash_message = "#{resource_class.model_name.human} successfully created"
72
- if params[:save_and_new]
73
- flash[:success] = flash_message
74
- redirect_to action: :new
75
- else
76
- flash.now[:success] = flash_message
77
- respond_to do |format|
78
- format.html { redirect_to url_for([parent_model, model].compact) }
79
- format.json { render json: model, status: :created }
80
- end
81
- end
82
- else
83
- respond_to do |format|
84
- format.html { render :new }
85
- format.json { render json: model.errors, status: :unprocessable_entity }
86
- end
87
- end
88
- end
89
-
90
- def update
91
- if parent_model
92
- self.model = parent_model.send(controller_name).find(params[:id])
93
- else
94
- self.model = resource_class.find(params[:id])
95
- end
96
-
97
- if model.update_attributes(params[resource_class.model_name.underscore])
98
- flash.now[:success] = "#{resource_class.model_name.human} successfully updated"
99
- respond_to do |format|
100
- format.html { redirect_to url_for([parent_model, model].compact) }
101
- format.json { head :no_content }
102
- end
103
- else
104
- respond_to do |format|
105
- format.html { render :edit }
106
- format.json { render json: model.errors, status: :unprocessable_entity }
107
- end
108
- end
109
- end
110
-
111
- def destroy
112
- if parent_model
113
- self.model = parent_model.send(controller_name).find(params[:id])
114
- else
115
- self.model = resource_class.find(params[:id])
116
- end
117
-
118
- if model.destroy
119
- flash[:warning] = "#{resource_class.model_name.human} successfully removed"
120
- respond_to do |format|
121
- format.html { redirect_to action: :index }
122
- format.json { head :no_content }
123
- end
124
- else
125
- flash[:danger] = "#{resource_class.model_name.human} could not be deleted"
126
- respond_to do |format|
127
- format.html { redirect_to action: :index }
128
- format.json { render json: model.errors, status: :unprocessable_entity }
129
- end
130
- end
131
- end
132
-
133
- def resource_class
134
- @resource_class ||= controller_name.classify.constantize
135
- end
136
-
137
- def controller_namespace
138
- @controller_namespace ||= self.class.name.split('::')[0..-2].map(&:underscore).join('_') unless self.class.name.split('::')[0..-2].empty?
139
- end
140
-
141
- private
142
-
143
- def collection=(value)
144
- instance_variable_set("@#{controller_name}", value)
145
- end
146
-
147
- def collection
148
- instance_variable_get("@#{controller_name}")
149
- end
150
-
151
- def model=(value)
152
- instance_variable_set("@#{controller_name.singularize}", value)
153
- end
154
-
155
- def model
156
- instance_variable_get("@#{controller_name.singularize}")
157
- end
158
-
159
- def load_nested
160
- parent_klass = self.class.dynamic_options[:nested_of]
161
- instance_variable_set("@#{parent_klass.to_s.underscore}", parent_klass.find(params["#{parent_klass.to_s.underscore}_id"]))
162
- end
163
-
164
- def parent_model
165
- instance_variable_get("@#{self.class.dynamic_options[:nested_of].to_s.underscore}")
166
- end
167
-
168
- def handle_error(error)
169
- respond_to do |format|
170
- format.html { raise error }
171
- format.json { render json: error.message, status: :internal_server_error }
172
- end
173
- end
174
-
175
- end
176
-
177
- end
178
-
179
- ActionController::Base.send :extend, DynamicController::ClassMethods
180
-
1
+ require 'ransack'
2
+ require 'kaminari'
3
+
4
+ require 'dynamic_controller/version'
5
+ require 'dynamic_controller/resource'
6
+ require 'dynamic_controller/responder'
7
+ require 'dynamic_controller/helper_methods'
8
+ require 'dynamic_controller/class_methods'
9
+ require 'dynamic_controller/instance_methods'
10
+
11
+ ActionController::Base.send :extend, DynamicController::ClassMethods
12
+
@@ -0,0 +1,15 @@
1
+ class AllActionsController < ActionController::Base
2
+ has_crud_actions
3
+ end
4
+
5
+ class OnlyIndexController < ActionController::Base
6
+ has_crud_actions only: :index
7
+ end
8
+
9
+ class ExceptIndexController < ActionController::Base
10
+ has_crud_actions except: :index
11
+ end
12
+
13
+ class OnlyAndExceptController < ActionController::Base
14
+ has_crud_actions only: [:index, :new, :create, :edit], except: [:edit, :destroy]
15
+ end