active_crudify 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +123 -0
  4. data/README.md +83 -0
  5. data/active_crudify.gemspec +22 -0
  6. data/config/locales/en.yml +9 -0
  7. data/config/locales/zh-CN.yml +9 -0
  8. data/lib/active_crudify.rb +39 -0
  9. data/lib/active_crudify/class_methods.rb +159 -0
  10. data/lib/active_crudify/hook_methods.rb +22 -0
  11. data/lib/active_crudify/responder.rb +6 -0
  12. data/spec/controllers/admin/posts_controller_spec.rb +33 -0
  13. data/spec/controllers/posts_controller_spec.rb +126 -0
  14. data/spec/dummy/.gitignore +15 -0
  15. data/spec/dummy/Gemfile +38 -0
  16. data/spec/dummy/Gemfile.lock +111 -0
  17. data/spec/dummy/README.rdoc +261 -0
  18. data/spec/dummy/Rakefile +7 -0
  19. data/spec/dummy/app/assets/images/rails.png +0 -0
  20. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  21. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  22. data/spec/dummy/app/controllers/admin/posts_controller.rb +3 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  24. data/spec/dummy/app/controllers/posts_controller.rb +4 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/mailers/.gitkeep +0 -0
  27. data/spec/dummy/app/models/.gitkeep +0 -0
  28. data/spec/dummy/app/models/post.rb +3 -0
  29. data/spec/dummy/app/views/admin/posts/index.html.erb +0 -0
  30. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  31. data/spec/dummy/app/views/posts/edit.html.erb +0 -0
  32. data/spec/dummy/app/views/posts/index.html.erb +0 -0
  33. data/spec/dummy/app/views/posts/new.html.erb +0 -0
  34. data/spec/dummy/app/views/posts/show.html.erb +0 -0
  35. data/spec/dummy/config.ru +4 -0
  36. data/spec/dummy/config/application.rb +59 -0
  37. data/spec/dummy/config/boot.rb +6 -0
  38. data/spec/dummy/config/database.yml +25 -0
  39. data/spec/dummy/config/environment.rb +5 -0
  40. data/spec/dummy/config/environments/development.rb +37 -0
  41. data/spec/dummy/config/environments/production.rb +67 -0
  42. data/spec/dummy/config/environments/test.rb +37 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/dummy/config/initializers/inflections.rb +15 -0
  45. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  46. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  47. data/spec/dummy/config/initializers/session_store.rb +8 -0
  48. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  49. data/spec/dummy/config/locales/en.yml +5 -0
  50. data/spec/dummy/config/routes.rb +62 -0
  51. data/spec/dummy/db/migrate/20120521063240_create_posts.rb +10 -0
  52. data/spec/dummy/db/schema.rb +23 -0
  53. data/spec/dummy/db/seeds.rb +7 -0
  54. data/spec/dummy/lib/assets/.gitkeep +0 -0
  55. data/spec/dummy/lib/tasks/.gitkeep +0 -0
  56. data/spec/dummy/log/.gitkeep +0 -0
  57. data/spec/dummy/public/404.html +26 -0
  58. data/spec/dummy/public/422.html +26 -0
  59. data/spec/dummy/public/500.html +25 -0
  60. data/spec/dummy/public/favicon.ico +0 -0
  61. data/spec/dummy/public/index.html +241 -0
  62. data/spec/dummy/public/robots.txt +5 -0
  63. data/spec/dummy/script/rails +6 -0
  64. data/spec/dummy/test/fixtures/posts.yml +9 -0
  65. data/spec/dummy/test/unit/post_test.rb +7 -0
  66. data/spec/spec.opts +5 -0
  67. data/spec/spec_helper.rb +44 -0
  68. metadata +162 -0
@@ -0,0 +1,2 @@
1
+ *.swp
2
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails'
6
+ gem 'sqlite3'
7
+
8
+ group :development, :test do
9
+ gem 'rspec'
10
+ gem 'rspec-rails'
11
+ gem 'factory_girl'
12
+ gem 'database_cleaner'
13
+ end
@@ -0,0 +1,123 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ active_crudify (0.1.0)
5
+ actionpack (>= 3.1)
6
+ kaminari
7
+ responders
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ actionmailer (3.2.3)
13
+ actionpack (= 3.2.3)
14
+ mail (~> 2.4.4)
15
+ actionpack (3.2.3)
16
+ activemodel (= 3.2.3)
17
+ activesupport (= 3.2.3)
18
+ builder (~> 3.0.0)
19
+ erubis (~> 2.7.0)
20
+ journey (~> 1.0.1)
21
+ rack (~> 1.4.0)
22
+ rack-cache (~> 1.2)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.1.2)
25
+ activemodel (3.2.3)
26
+ activesupport (= 3.2.3)
27
+ builder (~> 3.0.0)
28
+ activerecord (3.2.3)
29
+ activemodel (= 3.2.3)
30
+ activesupport (= 3.2.3)
31
+ arel (~> 3.0.2)
32
+ tzinfo (~> 0.3.29)
33
+ activeresource (3.2.3)
34
+ activemodel (= 3.2.3)
35
+ activesupport (= 3.2.3)
36
+ activesupport (3.2.3)
37
+ i18n (~> 0.6)
38
+ multi_json (~> 1.0)
39
+ arel (3.0.2)
40
+ builder (3.0.0)
41
+ database_cleaner (0.7.2)
42
+ diff-lcs (1.1.3)
43
+ erubis (2.7.0)
44
+ factory_girl (3.0.0)
45
+ activesupport (>= 3.0.0)
46
+ hike (1.2.1)
47
+ i18n (0.6.0)
48
+ journey (1.0.3)
49
+ json (1.7.1)
50
+ kaminari (0.13.0)
51
+ actionpack (>= 3.0.0)
52
+ activesupport (>= 3.0.0)
53
+ railties (>= 3.0.0)
54
+ mail (2.4.4)
55
+ i18n (>= 0.4.0)
56
+ mime-types (~> 1.16)
57
+ treetop (~> 1.4.8)
58
+ mime-types (1.18)
59
+ multi_json (1.3.4)
60
+ polyglot (0.3.3)
61
+ rack (1.4.1)
62
+ rack-cache (1.2)
63
+ rack (>= 0.4)
64
+ rack-ssl (1.3.2)
65
+ rack
66
+ rack-test (0.6.1)
67
+ rack (>= 1.0)
68
+ rails (3.2.3)
69
+ actionmailer (= 3.2.3)
70
+ actionpack (= 3.2.3)
71
+ activerecord (= 3.2.3)
72
+ activeresource (= 3.2.3)
73
+ activesupport (= 3.2.3)
74
+ bundler (~> 1.0)
75
+ railties (= 3.2.3)
76
+ railties (3.2.3)
77
+ actionpack (= 3.2.3)
78
+ activesupport (= 3.2.3)
79
+ rack-ssl (~> 1.3.2)
80
+ rake (>= 0.8.7)
81
+ rdoc (~> 3.4)
82
+ thor (~> 0.14.6)
83
+ rake (0.9.2.2)
84
+ rdoc (3.12)
85
+ json (~> 1.4)
86
+ responders (0.9.1)
87
+ railties (~> 3.1)
88
+ rspec (2.9.0)
89
+ rspec-core (~> 2.9.0)
90
+ rspec-expectations (~> 2.9.0)
91
+ rspec-mocks (~> 2.9.0)
92
+ rspec-core (2.9.0)
93
+ rspec-expectations (2.9.0)
94
+ diff-lcs (~> 1.1.3)
95
+ rspec-mocks (2.9.0)
96
+ rspec-rails (2.9.0)
97
+ actionpack (>= 3.0)
98
+ activesupport (>= 3.0)
99
+ railties (>= 3.0)
100
+ rspec (~> 2.9.0)
101
+ sprockets (2.1.3)
102
+ hike (~> 1.2)
103
+ rack (~> 1.0)
104
+ tilt (~> 1.1, != 1.3.0)
105
+ sqlite3 (1.3.6)
106
+ thor (0.14.6)
107
+ tilt (1.3.3)
108
+ treetop (1.4.10)
109
+ polyglot
110
+ polyglot (>= 0.3.1)
111
+ tzinfo (0.3.33)
112
+
113
+ PLATFORMS
114
+ ruby
115
+
116
+ DEPENDENCIES
117
+ active_crudify!
118
+ database_cleaner
119
+ factory_girl
120
+ rails
121
+ rspec
122
+ rspec-rails
123
+ sqlite3
@@ -0,0 +1,83 @@
1
+ ActiveCrudify
2
+ =======
3
+
4
+ A dynamic resource controller for Rails > 3.0 that keeps your controllers nice and skinny.
5
+
6
+ ActiveCrudify was inspired from Crudify.
7
+
8
+
9
+ Installation
10
+ ------------
11
+
12
+ It's best to install ActiveCrudify by adding your Rails project's Gemfile:
13
+
14
+ # Gemfile
15
+ source "http://rubygems.org"
16
+ gem 'active_crudify', '>= 0.1.0'
17
+
18
+ Now run:
19
+
20
+ bundle install
21
+
22
+
23
+ Usage
24
+ -----
25
+
26
+ In its most basic form, active_crudify is designed to be used like this:
27
+
28
+ class PostsController < ApplicationController
29
+ crudify :post
30
+ end
31
+
32
+
33
+ Say you want to customize an action that's being defined by crudify, simply overwrite it!
34
+
35
+ class PostsController < ApplicationController
36
+ crudify :post
37
+
38
+ def create
39
+ @post = Post.new(params[:post])
40
+ # ... the rest of your custom action
41
+ end
42
+ end
43
+
44
+
45
+ Ok that seems easy enough, but what if my action is just a tiny bit different? That's where the _hook methods_ come in...
46
+
47
+ ### Hook Methods
48
+
49
+ `before_create`
50
+ `before_update`
51
+ `before_destroy`
52
+ `before_action`
53
+
54
+ You can define hook_methods in your controller just like this:
55
+
56
+ def before_create
57
+ do_something
58
+ supre
59
+ end
60
+
61
+ Notice: that `before_create` calls a second hook; `before_action`. This is a generic hook that fires before every crud method's call to `save`, `update` or `destroy`. This means it might be helpful for you to call `super` when overwriting this method so that the chain of hooks keeps firing.
62
+
63
+ Notice: if hook_methods return false, the action will return. Because in action it call hook_methods just like this:
64
+
65
+ def create
66
+ ...
67
+ return if before_create === false
68
+ ...
69
+ end
70
+
71
+ Here's an example of a `before_create` hook:
72
+
73
+ class PostsController < ApplicationController
74
+ crudify :post
75
+
76
+ def before_create
77
+ @post.author == current_user
78
+ super
79
+ end
80
+
81
+ end
82
+
83
+ ### MIT License
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+
5
+ s.name = "active_crudify"
6
+ s.version = "0.1.1"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["kame"]
9
+ s.email = ["kamechb@gmail.com"]
10
+ s.homepage = "http://github.com/kamechb/active_crudify"
11
+
12
+ s.summary = %q{DRY controller actions for Rails > 3.0 and keeps your controllers nice and skinny.}
13
+ s.description = %q{DRY controller actions for Rails > 3.0 and keeps your controllers nice and skinny.}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency('actionpack', '>= 3.1')
20
+ s.add_dependency('kaminari')
21
+ s.add_dependency('responders')
22
+ end
@@ -0,0 +1,9 @@
1
+ en:
2
+ flash:
3
+ actions:
4
+ create:
5
+ notice: "%{resource_name} create successfully!"
6
+ alert: "%{resource_name} create failure!"
7
+ update:
8
+ notice: "%{resource_name} update successfully!"
9
+ alert: "%{resource_name} update failure!"
@@ -0,0 +1,9 @@
1
+ zh-CN:
2
+ flash:
3
+ actions:
4
+ create:
5
+ notice: "%{resource_name} 创建成功"
6
+ alert: "%{resource_name} 创建失败"
7
+ update:
8
+ notice: "%{resource_name} 更新成功"
9
+ alert: "%{resource_name} 更新失败"
@@ -0,0 +1,39 @@
1
+ require 'active_support'
2
+ require 'i18n'
3
+ require 'responders'
4
+ require 'action_controller'
5
+ require 'active_crudify/class_methods'
6
+ require 'active_crudify/hook_methods'
7
+ require 'active_crudify/responder'
8
+
9
+ module ActiveCrudify
10
+ class Engine < Rails::Engine
11
+ end
12
+
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ include ActiveCrudify::HookMethods
17
+ end
18
+
19
+ def self.default_options(model_name)
20
+ singular_name = model_name.to_s
21
+ plural_name = singular_name.pluralize
22
+ class_name = singular_name.camelize
23
+ {
24
+ :singular_name => singular_name,
25
+ :plural_name => plural_name,
26
+ :class_name => class_name,
27
+ :paginate => true,
28
+ :order_by => "created_at DESC",
29
+ :conditions => {},
30
+ :namespace => nil,
31
+ :log => Rails.env == 'development'
32
+ }
33
+ end
34
+
35
+ end
36
+
37
+ ActionController::Base.send(:include, ActiveCrudify)
38
+
39
+
@@ -0,0 +1,159 @@
1
+ module ActiveCrudify
2
+ module ClassMethods
3
+ # === Parameters
4
+ # * model_name
5
+ # Specify the model name like :post, :blog
6
+ # * options
7
+ #
8
+ # === Options
9
+ # [:class_name]
10
+ # Specify the class name for model.
11
+ # [:plural_name]
12
+ # [:order_by]
13
+ # [:conditions]
14
+ # Specify the condition which will be used in where clauses.
15
+ # [:namespace]
16
+ # Specify the controller in which namespace, like admin.
17
+ # [:only]
18
+ # Actions will be defined for controller.
19
+ # [:except]
20
+ # Define the actions exclude this option specified.
21
+ def crudify(model_name, options = {})
22
+ self.responder = ActiveCrudify::Responder
23
+ respond_to :html, :json, :xml
24
+
25
+ options = ActiveCrudify.default_options(model_name).merge(options)
26
+
27
+ allowed_actions = [:index, :new, :create, :show, :edit, :update, :destroy]
28
+ if options[:only]
29
+ allowed_actions = options[:only]
30
+ elsif options[:except]
31
+ allowed_actions = allowed_actions - options[:except]
32
+ end
33
+
34
+ singular_name = options[:singular_name]
35
+ plural_name = options[:plural_name]
36
+ class_name = options[:class_name]
37
+ klass = class_name.constantize
38
+ namespace = options[:namespace]
39
+ responded = namespace ? [namespace] : []
40
+
41
+
42
+ options[:paginate] = options[:paginate] && klass.respond_to?(:page)
43
+
44
+ module_eval %(
45
+ protected
46
+
47
+ def set_crud_options
48
+ @crud_options ||= #{options.inspect}
49
+ end
50
+
51
+ def what
52
+ @what ||= '#{options[:title]}'
53
+ end
54
+
55
+ def find_#{singular_name}
56
+ set_instance(#{class_name}.find(params[:id]))
57
+ end
58
+
59
+ def paginate_all_#{plural_name}
60
+ set_collection(#{class_name}.page(params[:page]).order(@crud_options[:order_by]).where(conditions))
61
+ end
62
+
63
+ def find_all_#{plural_name}
64
+ set_collection(#{class_name}.order(@crud_options[:order_by]).where(conditions))
65
+ end
66
+
67
+ def conditions
68
+ @conditions ||= @crud_options[:conditions]
69
+ end
70
+
71
+ def set_instance(record)
72
+ @instance = @#{singular_name} = record
73
+ end
74
+
75
+ def set_collection(records)
76
+ @collection = @#{plural_name} = records
77
+ end
78
+ )
79
+
80
+ module_eval %(
81
+
82
+ before_filter :find_#{singular_name},
83
+ :only => [:update, :destroy, :edit, :show]
84
+
85
+ before_filter :set_crud_options
86
+
87
+
88
+
89
+ if #{allowed_actions.include?(:new)}
90
+ def new
91
+ @#{singular_name} = #{class_name}.new
92
+ end
93
+ end
94
+
95
+ if #{allowed_actions.include?(:show)}
96
+ def show
97
+ respond_with(@#{singular_name})
98
+ end
99
+ end
100
+
101
+
102
+ if #{allowed_actions.include?(:create)}
103
+ def create
104
+ @instance = @#{singular_name} = #{class_name}.new(params[:#{singular_name}])
105
+ return if before_create === false
106
+ @instance.save
107
+ respond_with(#{namespace.inspect}, @#{singular_name})
108
+ end
109
+ end
110
+
111
+ if #{allowed_actions.include?(:edit)}
112
+ def edit
113
+
114
+ end
115
+ end
116
+
117
+ if #{allowed_actions.include?(:update)}
118
+ def update
119
+ return if before_update === false
120
+ @#{singular_name}.update_attributes(params[:#{singular_name}])
121
+ respond_with(#{namespace.inspect}, @#{singular_name})
122
+ end
123
+ end
124
+
125
+ if #{allowed_actions.include?(:destroy)}
126
+ def destroy
127
+ return if before_destroy === false
128
+ @#{singular_name}.destroy
129
+ respond_to do |f|
130
+ f.html { redirect_to([#{namespace.inspect}, :#{plural_name}]) }
131
+ f.any(:xml, :json) {head :ok}
132
+ end
133
+ end
134
+ end
135
+ )
136
+
137
+
138
+ if allowed_actions.include?(:index)
139
+ if options[:paginate]
140
+ module_eval %(
141
+ def index
142
+ paginate_all_#{plural_name}
143
+ respond_with(#{responded} << @#{plural_name})
144
+ end
145
+ )
146
+ else
147
+ module_eval %(
148
+ def index
149
+ find_all_#{plural_name}
150
+ respond_with(#{responded} << @#{plural_name})
151
+ end
152
+ )
153
+ end
154
+ end
155
+
156
+ end
157
+
158
+ end
159
+ end