action_args 1.0.2 → 1.0.3

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.
@@ -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.