action_args 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,12 +3,12 @@ language: ruby
3
3
  rvm:
4
4
  - 1.9.3
5
5
  - ruby-head
6
- - jruby-head
6
+ - jruby
7
7
  - rbx-19mode
8
8
  matrix:
9
9
  allow_failures:
10
10
  - rvm: ruby-head
11
- - rvm: jruby-head
11
+ - rvm: jruby
12
12
  - rvm: rbx-19mode
13
13
  gemfile:
14
14
  - gemfiles/rails_32.gemfile
@@ -0,0 +1,207 @@
1
+ # ActionArgs
2
+
3
+ Controller action arguments parameterizer for Rails 3+
4
+
5
+
6
+ ## What is this?
7
+
8
+ ActionArgs is a Rails plugin that extends your controller action methods to look and act like simple general Ruby methods with meaningful parameters, or in short, Merbish.
9
+
10
+
11
+ ## The Controllers
12
+
13
+ Having the following controller code:
14
+
15
+ ```ruby
16
+ class HogeController < ApplicationController
17
+ def fuga(piyo)
18
+ render :text => piyo
19
+ end
20
+ end
21
+ ```
22
+
23
+ Hitting "/hoge/fuga?piyo=foo" will call fuga('foo') and output 'foo'.
24
+ So, you do never need to touch the ugly `params` Hash in order to fetch the request parameters.
25
+
26
+
27
+ ## StrongParameters
28
+
29
+ ActionArgs plays very nice with Rails 4 StrongParameters.
30
+
31
+ In this `show` action, ActionArgs `require`s the `id` parameter.
32
+ Hence, raises an error if the `id` value has not been specified, in the same way as usual Ruby methods do.
33
+
34
+ ```ruby
35
+ class UsersController < ApplicationController
36
+ # the `id` parameter is mandatory
37
+ def show(id)
38
+ @user = User.find id
39
+ end
40
+ end
41
+ ```
42
+
43
+ If you don't want ActionArgs to check the existence of some action parameters, you can make them optional by defining their default values.
44
+ Again, it just acts in the same way as usual Ruby methods do.
45
+
46
+ ```ruby
47
+ class UsersController < ApplicationController
48
+ # the `page` parameter is optional
49
+ def index(page = nil)
50
+ @users = User.page(page).per(50)
51
+ end
52
+ end
53
+ ```
54
+
55
+ Hashes in the action method arguments simply respond to the StrongParameters' `permit` method.
56
+
57
+ ```ruby
58
+ class UsersController < ApplicationController
59
+ def create(user)
60
+ @user = User.new(user.permit(:name, :age))
61
+ ...
62
+ end
63
+ end
64
+ ```
65
+
66
+ Moreover, ActionArgs provides declarative `permits` method for controller classes,
67
+ so that you can DRY up your `permit` calls in the most comprehensible way.
68
+ The `permits` method assumes the model class from the controller name, and
69
+ `permit`s the action arguments containing attributes for that model.
70
+
71
+ ```ruby
72
+ class UsersController < ApplicationController
73
+ # white-lists User model's attributes
74
+ permits :name, :age
75
+
76
+ # the given `user` parameter would be automatically permitted by ActionArgs
77
+ def create(user)
78
+ @user = User.new(user)
79
+ end
80
+ end
81
+ ```
82
+
83
+
84
+ ## The Scaffold Generator
85
+
86
+ ActionArgs provides a custom scaffold controller generator that overwrites the default scaffold generator.
87
+ Thus, by hitting the scaffold generator command like this:
88
+
89
+ ```sh
90
+ % rails g scaffold user name age:integer email
91
+ ```
92
+
93
+ The following beautiful controller code will be generated:
94
+
95
+ ```ruby
96
+ # coding: utf-8
97
+
98
+ class UsersController < ApplicationController
99
+ permits :name, :age, :email
100
+
101
+ # GET /users
102
+ def index
103
+ @users = User.all
104
+ end
105
+
106
+ # GET /users/1
107
+ def show(id)
108
+ @user = User.find(id)
109
+ end
110
+
111
+ # GET /users/new
112
+ def new
113
+ @user = User.new
114
+ end
115
+
116
+ # GET /users/1/edit
117
+ def edit(id)
118
+ @user = User.find(id)
119
+ end
120
+
121
+ # POST /users
122
+ def create(user)
123
+ @user = User.new(user)
124
+
125
+ if @user.save
126
+ redirect_to @user, notice: 'User was successfully created.'
127
+ else
128
+ render action: 'new'
129
+ end
130
+ end
131
+
132
+ # PUT /users/1
133
+ def update(id, user)
134
+ @user = User.find(id)
135
+
136
+ if @user.update_attributes(user)
137
+ redirect_to @user, notice: 'User was successfully updated.'
138
+ else
139
+ render action: 'edit'
140
+ end
141
+ end
142
+
143
+ # DELETE /users/1
144
+ def destroy(id)
145
+ @user = User.find(id)
146
+ @user.destroy
147
+
148
+ redirect_to users_url
149
+ end
150
+ end
151
+ ```
152
+
153
+ You may notice that
154
+ * There are no globalish `params` referrence
155
+ * It's quite easy to comprehend what's the actual input value for each action
156
+ * You may write the unit test code as if the actions are just normal Ruby methods
157
+
158
+
159
+ ## Supported versions
160
+
161
+ * Ruby 1.9.2, 1.9.3, 2.0.0 (trunk), JRuby & Rubinius with 1.9 mode
162
+
163
+ * Rails 3.0.x, 3.1.x, 3.2.x, 4.0 (edge)
164
+
165
+
166
+ ## Installation
167
+
168
+ Put this line in your Gemfile:
169
+ ```ruby
170
+ gem 'action_args'
171
+ ```
172
+
173
+ Then bundle:
174
+ ```sh
175
+ % bundle
176
+ ```
177
+
178
+ ## Notes
179
+
180
+ ### Plain Old Action Methods
181
+
182
+ Of courese you still can use both Merbish style and plain old Rails style action methods even if this plugin is loaded. `params` parameter is still alive as well. That means, this plugin won't break any existing controller API.
183
+
184
+ ### Argument Naming Convention
185
+
186
+ Each action method parameter name corresponds to `params` key name. For example, the following beautifully written nested show action works perfectly (this might not be a very good example of effective querying, but that's another story).
187
+
188
+ ```ruby
189
+ Rails.application.routes.draw do
190
+ resources :authors do
191
+ resources :books
192
+ end
193
+ end
194
+
195
+ class BooksController < ApplicationController
196
+ # GET /authors/:author_id/books/:id
197
+ def show(author_id, id)
198
+ @book = Author.find(author_id).books.find(id)
199
+ end
200
+ ...
201
+ end
202
+ ```
203
+
204
+
205
+ ## Copyright
206
+
207
+ Copyright (c) 2011 Asakusa.rb. See MIT-LICENSE for further details.
@@ -18,6 +18,4 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
-
22
- s.add_development_dependency 'sqlite3', ['>= 0']
23
21
  end
@@ -4,3 +4,11 @@ gem 'rails', '>= 3.2.9'
4
4
  gem 'rspec-rails', '>= 2.0'
5
5
 
6
6
  gemspec :path => '../'
7
+
8
+ platforms :ruby do
9
+ gem 'sqlite3'
10
+ end
11
+
12
+ platforms :jruby do
13
+ gem 'activerecord-jdbcsqlite3-adapter'
14
+ end
@@ -6,3 +6,11 @@ gem 'journey', github: 'rails/journey'
6
6
  gem 'rspec-rails', '>= 2.0'
7
7
 
8
8
  gemspec :path => '../'
9
+
10
+ platforms :ruby do
11
+ gem 'sqlite3'
12
+ end
13
+
14
+ platforms :jruby do
15
+ gem 'activerecord-jdbcsqlite3-adapter'
16
+ end
@@ -1,12 +1,12 @@
1
1
  module AbstractController
2
2
  class Base
3
- def send_action(method_name, *args)
4
- return send method_name, *args unless args.blank?
3
+ if defined? ActionController::StrongParameters
4
+ def send_action(method_name, *args)
5
+ return send method_name, *args unless args.empty?
5
6
 
6
- values = if defined? ActionController::StrongParameters
7
7
  target_model_name = self.class.name.sub(/Controller$/, '').singularize.underscore.to_sym
8
8
  permitted_attributes = self.class.instance_variable_get '@permitted_attributes'
9
- method(method_name).parameters.reject {|type, _| type == :block }.map do |type, key|
9
+ values = method(method_name).parameters.reject {|type, _| type == :block }.map do |type, key|
10
10
  params.require key if type == :req
11
11
  if (key == target_model_name) && permitted_attributes
12
12
  params[key].try :permit, *permitted_attributes
@@ -14,26 +14,32 @@ module AbstractController
14
14
  params[key]
15
15
  end
16
16
  end
17
- else
18
- method(method_name).parameters.reject {|type, _| type == :block }.map(&:last).map {|key| params[key]}
17
+ send method_name, *values
19
18
  end
20
- send method_name, *values
21
- end
22
19
 
23
- # You can configure StrongParameters' `permit` attributes using this DSL method.
24
- # The `permit` call will be invoked only against parameters having the resource
25
- # model name inferred from the controller class name.
26
- #
27
- # class UsersController < ApplicationController
28
- # permits :name, :age
29
- #
30
- # def create(user)
31
- # @user = User.new(user)
32
- # end
33
- # end
34
- #
35
- def self.permits(*attributes)
36
- @permitted_attributes = attributes
20
+ # You can configure StrongParameters' `permit` attributes using this DSL method.
21
+ # The `permit` call will be invoked only against parameters having the resource
22
+ # model name inferred from the controller class name.
23
+ #
24
+ # class UsersController < ApplicationController
25
+ # permits :name, :age
26
+ #
27
+ # def create(user)
28
+ # @user = User.new(user)
29
+ # end
30
+ # end
31
+ #
32
+ def self.permits(*attributes)
33
+ @permitted_attributes = attributes
34
+ end
35
+ # no StrongParameters
36
+ else
37
+ def send_action(method_name, *args)
38
+ return send method_name, *args unless args.empty?
39
+
40
+ values = method(method_name).parameters.reject {|type, _| type == :block }.map {|_, key| params[key]}
41
+ send method_name, *values
42
+ end
37
43
  end
38
44
  end
39
45
  end
@@ -1,3 +1,3 @@
1
1
  module ActionArgs
2
- VERSION = '1.0.2'
2
+ VERSION = '1.0.3'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_args
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-29 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: sqlite3
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
12
+ date: 2012-11-30 00:00:00.000000000 Z
13
+ dependencies: []
30
14
  description: Rails plugin gem that supports Merbish style controller action arguments.
31
15
  email:
32
16
  - ronnie@dio.jp
@@ -38,7 +22,7 @@ files:
38
22
  - .travis.yml
39
23
  - Gemfile
40
24
  - MIT-LICENSE
41
- - README.rdoc
25
+ - README.md
42
26
  - Rakefile
43
27
  - action_args.gemspec
44
28
  - gemfiles/rails_32.gemfile
@@ -1,193 +0,0 @@
1
- = ActionArgs
2
-
3
- Controller action arguments parameterizer for Rails 3+
4
-
5
-
6
- == What is this?
7
-
8
- ActionArgs is a Rails plugin that extends your controller action methods to look and act like simple general Ruby methods with meaningful parameters, or in short, Merbish.
9
-
10
-
11
- == The Controllers
12
-
13
- Having the following controller code:
14
-
15
- class HogeController < ApplicationController
16
- def fuga(piyo)
17
- render :text => piyo
18
- end
19
- end
20
-
21
- Hitting "/hoge/fuga?piyo=foo" will call fuga('foo') and output 'foo'.
22
- So, you do never need to touch the ugly +params+ Hash in order to fetch the request parameters.
23
-
24
-
25
- == StrongParameters
26
-
27
- ActionArgs plays very nice with Rails 4 StrongParameters.
28
-
29
- In this `show` action, ActionArgs `require`s the `id` parameter.
30
- Hence, raises an error if the `id` value has not been specified, in the same way as usual Ruby methods do.
31
-
32
- class UsersController < ApplicationController
33
- # the `id` parameter is mandatory
34
- def show(id)
35
- @user = User.find id
36
- end
37
- end
38
-
39
- If you don't want ActionArgs to check the existence of some action parameters, you can make them optional by defining their default values.
40
- Again, it just acts in the same way as usual Ruby methods do.
41
-
42
- class UsersController < ApplicationController
43
- # the `page` parameter is optional
44
- def index(page = nil)
45
- @users = User.page(page).per(50)
46
- end
47
- end
48
-
49
- Hashes in the action method arguments simply respond to the StrongParameters' `permit` method.
50
-
51
- class UsersController < ApplicationController
52
- def create(user)
53
- @user = User.new(user.permit(:name, :age))
54
- ...
55
- end
56
- end
57
-
58
- Moreover, ActionArgs provides declarative `permits` method for controller classes,
59
- so that you can DRY up your `permit` calls in the most comprehensible way.
60
- The `permits` method assumes the model class from the controller name, and
61
- `permit`s the action arguments containing attributes for that model.
62
-
63
- class UsersController < ApplicationController
64
- # white-lists User model's attributes
65
- permits :name, :age
66
-
67
- # the given `user` parameter would be automatically permitted by ActionArgs
68
- def create(user)
69
- @user = User.new(user)
70
- end
71
- end
72
-
73
-
74
- == The Scaffold Generator
75
-
76
- ActionArgs provides a custom scaffold controller generator that overwrites the default scaffold generator.
77
- Thus, by hitting the following command:
78
-
79
- % rails g scaffold user name age:integer email
80
-
81
- The following beautiful controller code will be generated:
82
-
83
- # coding: utf-8
84
-
85
- class UsersController < ApplicationController
86
- permits :name, :age, :email
87
-
88
- # GET /users
89
- def index
90
- @users = User.all
91
- end
92
-
93
- # GET /users/1
94
- def show(id)
95
- @user = User.find(id)
96
- end
97
-
98
- # GET /users/new
99
- def new
100
- @user = User.new
101
- end
102
-
103
- # GET /users/1/edit
104
- def edit(id)
105
- @user = User.find(id)
106
- end
107
-
108
- # POST /users
109
- def create(user)
110
- @user = User.new(user)
111
-
112
- if @user.save
113
- redirect_to @user, notice: 'User was successfully created.'
114
- else
115
- render action: 'new'
116
- end
117
- end
118
-
119
- # PUT /users/1
120
- def update(id, user)
121
- @user = User.find(id)
122
-
123
- if @user.update_attributes(user)
124
- redirect_to @user, notice: 'User was successfully updated.'
125
- else
126
- render action: 'edit'
127
- end
128
- end
129
-
130
- # DELETE /users/1
131
- def destroy(id)
132
- @user = User.find(id)
133
- @user.destroy
134
-
135
- redirect_to users_url
136
- end
137
- end
138
-
139
- You may notice that
140
- * There are no globalish +params+ referrence
141
- * It's quite easy to comprehend what's the actual input value for each action
142
- * You may write the unit test code as if the actions are just normal Ruby methods
143
-
144
-
145
- == Supported versions
146
-
147
- * Ruby 1.9.2, 1.9.3, 2.0.0 (trunk)
148
-
149
- * Rails 3.0.x, 3.1.x, 3.2.x, 4.0 (edge)
150
-
151
-
152
- == Installation
153
-
154
- Put this line in your Gemfile:
155
- gem 'action_args'
156
-
157
- Then bundle:
158
- % bundle
159
-
160
-
161
- == Notes
162
-
163
- === Plain Old Action Methods
164
-
165
- Of courese you still can use both Merbish style and plain old Rails style action methods even if this plugin is loaded. +params+ parameter is still alive as well. That means, this plugin won't break any existing controller API.
166
-
167
- === Argument Naming Convention
168
-
169
- Each action method parameter name corresponds to +params+ key name. For example, the following beautifully written nested show action works perfectly (this might not be a very good example of effective querying, but that's another story).
170
-
171
- Rails.application.routes.draw do
172
- resources :authors do
173
- resources :books
174
- end
175
- end
176
-
177
- class BooksController < ApplicationController
178
- # GET /authors/:author_id/books/:id
179
- def show(author_id, id)
180
- @book = Author.find(author_id).books.find(id)
181
- end
182
- ...
183
- end
184
-
185
-
186
- == Todo
187
-
188
- * other Ruby implementations
189
-
190
-
191
- == Copyright
192
-
193
- Copyright (c) 2011 Asakusa.rb. See MIT-LICENSE for further details.