action_args 2.3.2 → 2.7.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.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +88 -0
- data/README.md +71 -46
- data/Rakefile +1 -19
- data/action_args.gemspec +6 -3
- data/gemfiles/rails_41.gemfile +1 -1
- data/gemfiles/rails_42.gemfile +1 -1
- data/gemfiles/rails_50.gemfile +1 -3
- data/gemfiles/rails_51.gemfile +1 -3
- data/gemfiles/rails_52.gemfile +1 -3
- data/gemfiles/rails_60.gemfile +16 -0
- data/gemfiles/rails_61.gemfile +16 -0
- data/gemfiles/rails_70.gemfile +17 -0
- data/gemfiles/rails_edge.gemfile +2 -5
- data/lib/action_args/abstract_controller.rb +6 -2
- data/lib/action_args/callbacks.rb +66 -50
- data/lib/action_args/params_handler.rb +12 -11
- data/lib/action_args/version.rb +1 -1
- metadata +13 -33
- data/.travis.yml +0 -64
- data/test/controllers/action_args_controller_test.rb +0 -45
- data/test/controllers/hooks_test.rb +0 -31
- data/test/controllers/kwargs_controller_test.rb +0 -32
- data/test/controllers/kwargs_keyreq_controller_test.rb +0 -32
- data/test/controllers/ordinal_controller_test.rb +0 -11
- data/test/controllers/strong_parameters_test.rb +0 -59
- data/test/fake_app.rb +0 -193
- data/test/kwargs_controllers.rb +0 -10
- data/test/kwargs_keyreq_controllers.rb +0 -10
- data/test/mailers/action_mailer_test.rb +0 -15
- data/test/params_handler/params_handler_test.rb +0 -194
- data/test/test_helper.rb +0 -30
@@ -9,20 +9,21 @@ module ActionArgs
|
|
9
9
|
kwargs, missing_required_params = {}, []
|
10
10
|
parameter_names = method_parameters.map(&:last)
|
11
11
|
method_parameters.reverse_each do |type, key|
|
12
|
+
trimmed_key = key.to_s.sub(/_params\z/, '').to_sym
|
12
13
|
case type
|
13
14
|
when :req
|
14
|
-
missing_required_params << key unless params.key?
|
15
|
+
missing_required_params << key unless params.key? trimmed_key
|
15
16
|
next
|
16
17
|
when :keyreq
|
17
|
-
if params.key?
|
18
|
-
kwargs[key] = params[
|
18
|
+
if params.key? trimmed_key
|
19
|
+
kwargs[key] = params[trimmed_key]
|
19
20
|
else
|
20
21
|
missing_required_params << key
|
21
22
|
end
|
22
23
|
when :key
|
23
|
-
kwargs[key] = params[
|
24
|
+
kwargs[key] = params[trimmed_key] if params.key? trimmed_key
|
24
25
|
when :opt
|
25
|
-
break if params.key?
|
26
|
+
break if params.key? trimmed_key
|
26
27
|
end
|
27
28
|
# omitting parameters that are :block, :rest, :opt without a param, and :key without a param
|
28
29
|
parameter_names.delete key
|
@@ -36,9 +37,8 @@ module ActionArgs
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
39
|
-
values = parameter_names.map {|k| params[k]}
|
40
|
-
values
|
41
|
-
values
|
40
|
+
values = parameter_names.map {|k| params[k.to_s.sub(/_params\z/, '').to_sym]}
|
41
|
+
[values, kwargs]
|
42
42
|
end
|
43
43
|
|
44
44
|
# permits declared model attributes in the params Hash
|
@@ -50,9 +50,10 @@ module ActionArgs
|
|
50
50
|
|
51
51
|
method_parameters = method(method_name).parameters
|
52
52
|
method_parameters.each do |type, key|
|
53
|
-
|
54
|
-
|
55
|
-
params
|
53
|
+
trimmed_key = key.to_s.sub(/_params\z/, '').to_sym
|
54
|
+
if (trimmed_key == target_model_name) && permitted_attributes
|
55
|
+
params.require(trimmed_key) if %i[req keyreq].include?(type)
|
56
|
+
params[trimmed_key] = params[trimmed_key].try :permit, *permitted_attributes if params.key? trimmed_key
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
data/lib/action_args/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_args
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akira Matsuda
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -59,8 +59,8 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
+
- ".github/workflows/main.yml"
|
62
63
|
- ".gitignore"
|
63
|
-
- ".travis.yml"
|
64
64
|
- CONTRIBUTING.md
|
65
65
|
- Gemfile
|
66
66
|
- MIT-LICENSE
|
@@ -72,6 +72,9 @@ files:
|
|
72
72
|
- gemfiles/rails_50.gemfile
|
73
73
|
- gemfiles/rails_51.gemfile
|
74
74
|
- gemfiles/rails_52.gemfile
|
75
|
+
- gemfiles/rails_60.gemfile
|
76
|
+
- gemfiles/rails_61.gemfile
|
77
|
+
- gemfiles/rails_70.gemfile
|
75
78
|
- gemfiles/rails_edge.gemfile
|
76
79
|
- lib/action_args.rb
|
77
80
|
- lib/action_args/abstract_controller.rb
|
@@ -80,23 +83,12 @@ files:
|
|
80
83
|
- lib/action_args/version.rb
|
81
84
|
- lib/generators/rails/action_args_scaffold_controller_generator.rb
|
82
85
|
- lib/generators/rails/templates/controller.rb
|
83
|
-
- test/controllers/action_args_controller_test.rb
|
84
|
-
- test/controllers/hooks_test.rb
|
85
|
-
- test/controllers/kwargs_controller_test.rb
|
86
|
-
- test/controllers/kwargs_keyreq_controller_test.rb
|
87
|
-
- test/controllers/ordinal_controller_test.rb
|
88
|
-
- test/controllers/strong_parameters_test.rb
|
89
|
-
- test/fake_app.rb
|
90
|
-
- test/kwargs_controllers.rb
|
91
|
-
- test/kwargs_keyreq_controllers.rb
|
92
|
-
- test/mailers/action_mailer_test.rb
|
93
|
-
- test/params_handler/params_handler_test.rb
|
94
|
-
- test/test_helper.rb
|
95
86
|
homepage: http://asakusa.rubyist.net/
|
96
87
|
licenses:
|
97
88
|
- MIT
|
98
|
-
metadata:
|
99
|
-
|
89
|
+
metadata:
|
90
|
+
source_code_uri: https://github.com/asakusarb/action_args
|
91
|
+
post_install_message:
|
100
92
|
rdoc_options: []
|
101
93
|
require_paths:
|
102
94
|
- lib
|
@@ -111,20 +103,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
103
|
- !ruby/object:Gem::Version
|
112
104
|
version: '0'
|
113
105
|
requirements: []
|
114
|
-
rubygems_version: 3.0.
|
115
|
-
signing_key:
|
106
|
+
rubygems_version: 3.3.0.dev
|
107
|
+
signing_key:
|
116
108
|
specification_version: 4
|
117
109
|
summary: Controller action arguments parameterizer for Rails 4+ & Ruby 2.0+
|
118
|
-
test_files:
|
119
|
-
- test/controllers/action_args_controller_test.rb
|
120
|
-
- test/controllers/hooks_test.rb
|
121
|
-
- test/controllers/kwargs_controller_test.rb
|
122
|
-
- test/controllers/kwargs_keyreq_controller_test.rb
|
123
|
-
- test/controllers/ordinal_controller_test.rb
|
124
|
-
- test/controllers/strong_parameters_test.rb
|
125
|
-
- test/fake_app.rb
|
126
|
-
- test/kwargs_controllers.rb
|
127
|
-
- test/kwargs_keyreq_controllers.rb
|
128
|
-
- test/mailers/action_mailer_test.rb
|
129
|
-
- test/params_handler/params_handler_test.rb
|
130
|
-
- test/test_helper.rb
|
110
|
+
test_files: []
|
data/.travis.yml
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
script: 'bundle exec rake -t test'
|
2
|
-
language: ruby
|
3
|
-
sudo: false
|
4
|
-
|
5
|
-
before_install:
|
6
|
-
- "ruby -e 'exit RUBY_VERSION.to_f >= 2.3' && gem up --system || gem i rubygems-update -v '<3' && update_rubygems"
|
7
|
-
- gem up bundler
|
8
|
-
|
9
|
-
# rvm:
|
10
|
-
# - 2.6.0
|
11
|
-
# - 2.5.3
|
12
|
-
# - 2.4.5
|
13
|
-
# - 2.3.7
|
14
|
-
# - 2.2.10
|
15
|
-
# - 2.1.10
|
16
|
-
# - 2.0.0
|
17
|
-
# - ruby-head
|
18
|
-
# gemfile:
|
19
|
-
# - gemfiles/rails_52.gemfile
|
20
|
-
# - gemfiles/rails_51.gemfile
|
21
|
-
# - gemfiles/rails_50.gemfile
|
22
|
-
# - gemfiles/rails_42.gemfile
|
23
|
-
# - gemfiles/rails_41.gemfile
|
24
|
-
# - gemfiles/rails_edge.gemfile
|
25
|
-
|
26
|
-
matrix:
|
27
|
-
include:
|
28
|
-
- rvm: 2.6.0
|
29
|
-
gemfile: gemfiles/rails_52.gemfile
|
30
|
-
- rvm: 2.6.0
|
31
|
-
gemfile: gemfiles/rails_51.gemfile
|
32
|
-
- rvm: 2.6.0
|
33
|
-
gemfile: gemfiles/rails_50.gemfile
|
34
|
-
- rvm: 2.6.0
|
35
|
-
gemfile: gemfiles/rails_edge.gemfile
|
36
|
-
- rvm: 2.5.3
|
37
|
-
gemfile: gemfiles/rails_52.gemfile
|
38
|
-
- rvm: 2.4.5
|
39
|
-
gemfile: gemfiles/rails_52.gemfile
|
40
|
-
- rvm: 2.3.8
|
41
|
-
gemfile: gemfiles/rails_52.gemfile
|
42
|
-
- rvm: 2.2.10
|
43
|
-
gemfile: gemfiles/rails_42.gemfile
|
44
|
-
- rvm: 2.2.10
|
45
|
-
gemfile: gemfiles/rails_41.gemfile
|
46
|
-
- rvm: 2.1.10
|
47
|
-
gemfile: gemfiles/rails_42.gemfile
|
48
|
-
- rvm: 2.0.0
|
49
|
-
gemfile: gemfiles/rails_42.gemfile
|
50
|
-
|
51
|
-
- rvm: ruby-head
|
52
|
-
gemfile: gemfiles/rails_52.gemfile
|
53
|
-
- rvm: ruby-head
|
54
|
-
gemfile: gemfiles/rails_edge.gemfile
|
55
|
-
|
56
|
-
- rvm: jruby-9.2.0.0
|
57
|
-
gemfile: gemfiles/rails_52.gemfile
|
58
|
-
- rvm: rubinius-3
|
59
|
-
gemfile: gemfiles/rails_52.gemfile
|
60
|
-
|
61
|
-
allow_failures:
|
62
|
-
- rvm: jruby-9.2.0.0
|
63
|
-
- rvm: rubinius-3
|
64
|
-
- gemfile: gemfiles/rails_edge.gemfile
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class BooksControllerTest < ActionController::TestCase
|
6
|
-
sub_test_case 'GET index (having an optional parameter)' do
|
7
|
-
setup do
|
8
|
-
@books = []
|
9
|
-
Book.delete_all
|
10
|
-
100.times {|i| @books << Book.create!(title: 'book'+i.to_s) }
|
11
|
-
end
|
12
|
-
|
13
|
-
test 'without page parameter' do
|
14
|
-
get :index
|
15
|
-
assert 200, response.code
|
16
|
-
assert_equal @books[0..9], assigns(:books)
|
17
|
-
end
|
18
|
-
|
19
|
-
test 'with page parameter' do
|
20
|
-
get :index, params: {page: 3}
|
21
|
-
assert 200, response.code
|
22
|
-
assert_equal @books[20..29], assigns(:books)
|
23
|
-
end
|
24
|
-
|
25
|
-
test 'first param is nil and second is not nil' do
|
26
|
-
rhg = Book.create! title: 'RHG'
|
27
|
-
Book.create! title: 'AWDwR'
|
28
|
-
get :index, params: {q: 'RH'}
|
29
|
-
assert_equal [rhg], assigns(:books)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
test 'GET show' do
|
34
|
-
rhg = Book.create! title: 'RHG'
|
35
|
-
get :show, params: {id: rhg.id}
|
36
|
-
assert_equal rhg, assigns(:book)
|
37
|
-
end
|
38
|
-
|
39
|
-
test 'POST create' do
|
40
|
-
Book.create! title: 'RHG'
|
41
|
-
books_count_was = Book.count
|
42
|
-
post :create, params: {book: {title: 'AWDwR', price: 24}}
|
43
|
-
assert_equal 1, Book.count - books_count_was
|
44
|
-
end
|
45
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class BooksControllerTest < ActionController::TestCase
|
6
|
-
setup do
|
7
|
-
Book.delete_all
|
8
|
-
@book = Book.create! title: 'Head First ActionArgs'
|
9
|
-
get :show, params: {id: @book.id}
|
10
|
-
end
|
11
|
-
|
12
|
-
sub_test_case 'before_action' do
|
13
|
-
test 'via Symbol' do
|
14
|
-
assert_equal @book, assigns(:book)
|
15
|
-
end
|
16
|
-
|
17
|
-
if Rails.version < '5.1'
|
18
|
-
test 'via String' do
|
19
|
-
assert assigns(:string_filter_executed)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
test 'via Proc' do
|
24
|
-
assert assigns(:proc_filter_executed)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
test 'around_action' do
|
29
|
-
assert_not_nil assigns(:elapsed_time)
|
30
|
-
end
|
31
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class KwBooksControllerTest < ActionController::TestCase
|
6
|
-
sub_test_case 'GET index (having an optional parameter)' do
|
7
|
-
test 'without giving any kw parameter (not even giving :required one)' do
|
8
|
-
assert_raises(ActionController::BadRequest) { get :index }
|
9
|
-
end
|
10
|
-
|
11
|
-
test 'without giving any optional kw parameter' do
|
12
|
-
get :index, params: {author_name: 'nari'}
|
13
|
-
assert 200, response.code
|
14
|
-
end
|
15
|
-
|
16
|
-
test 'with kw parameter defaults to non-nil value' do
|
17
|
-
get :index, params: {author_name: 'nari', page: 3}
|
18
|
-
body = eval response.body
|
19
|
-
assert_equal 'nari', body[:author_name]
|
20
|
-
assert_equal '3', body[:page]
|
21
|
-
assert_nil body[:q]
|
22
|
-
end
|
23
|
-
|
24
|
-
test 'with kw parameter defaults to nil' do
|
25
|
-
get :index, params: {author_name: 'nari', q: 'Rails'}
|
26
|
-
body = eval response.body
|
27
|
-
assert_equal 'nari', body[:author_name]
|
28
|
-
assert_equal '1', body[:page]
|
29
|
-
assert_equal 'Rails', body[:q]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class KwKeyreqBooksControllerTest < ActionController::TestCase
|
6
|
-
sub_test_case 'GET index (having an optional parameter)' do
|
7
|
-
test 'without giving any kw parameter (not even giving :required one)' do
|
8
|
-
assert_raises(ActionController::BadRequest) { get :index }
|
9
|
-
end
|
10
|
-
|
11
|
-
test 'without giving any kw parameter' do
|
12
|
-
get :index, params: {author_name: 'nari'}
|
13
|
-
assert 200, response.code
|
14
|
-
end
|
15
|
-
|
16
|
-
test 'with kw parameter defaults to non-nil value' do
|
17
|
-
get :index, params: {author_name: 'nari', page: 3}
|
18
|
-
body = eval response.body
|
19
|
-
assert_equal 'nari', body[:author_name]
|
20
|
-
assert_equal '3', body[:page]
|
21
|
-
assert_nil body[:q]
|
22
|
-
end
|
23
|
-
|
24
|
-
test 'with kw parameter defaults to nil' do
|
25
|
-
get :index, params: {author_name: 'nari', q: 'Rails'}
|
26
|
-
body = eval response.body
|
27
|
-
assert_equal 'nari', body[:author_name]
|
28
|
-
assert_equal '1', body[:page]
|
29
|
-
assert_equal 'Rails', body[:q]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end if RUBY_VERSION >= '2.1'
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class AuthorsControllerTest < ActionController::TestCase
|
6
|
-
test 'GET show' do
|
7
|
-
matz = Author.create! name: 'Matz'
|
8
|
-
get :show, params: {id: matz.id}
|
9
|
-
assert_equal matz, assigns(:author)
|
10
|
-
end
|
11
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class StoresControllerTest < ActionController::TestCase
|
6
|
-
test 'GET show' do
|
7
|
-
tatsu_zine = Store.create! name: 'Tatsu-zine'
|
8
|
-
get :show, params: {id: tatsu_zine.id}
|
9
|
-
|
10
|
-
assert_equal tatsu_zine, assigns(:store)
|
11
|
-
end
|
12
|
-
|
13
|
-
sub_test_case 'GET new' do
|
14
|
-
test 'without store parameter' do
|
15
|
-
get :new
|
16
|
-
assert 200, response.code
|
17
|
-
assert_equal 'PragProg', assigns(:store).name
|
18
|
-
end
|
19
|
-
test 'with store parameter' do
|
20
|
-
get :new, params: {store: {name: 'Tatsu-zine'}}
|
21
|
-
assert 200, response.code
|
22
|
-
assert_equal 'Tatsu-zine', assigns(:store).name
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
test 'POST create' do
|
27
|
-
store_count_was = Store.count
|
28
|
-
post :create, params: {store: {name: 'Tatsu-zine', url: 'http://tatsu-zine.com'}}
|
29
|
-
|
30
|
-
assert_equal 1, Store.count - store_count_was
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class MoviesControllerTest < ActionController::TestCase
|
35
|
-
test 'POST create' do
|
36
|
-
movie_count_was = Movie.count
|
37
|
-
post :create, params: {movie: {title: 'Dr. No', actors_attributes: [{name: 'Bernard Lee'}]}}
|
38
|
-
|
39
|
-
assert_equal 1, Movie.count - movie_count_was
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# this controller doesn't permit price of new book do
|
44
|
-
class Admin::BooksControllerTest < ActionController::TestCase
|
45
|
-
test 'POST create' do
|
46
|
-
post :create, params: {book: {title: 'naruhoUnix', price: 30}}
|
47
|
-
|
48
|
-
assert_nil Book.last.price
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
class Admin::AccountsControllerTest < ActionController::TestCase
|
53
|
-
test 'POST create' do
|
54
|
-
admin_account_count_was = Admin::Account.count
|
55
|
-
post :create, params: {admin_account: {name: 'amatsuda'}}
|
56
|
-
|
57
|
-
assert_equal 1, Admin::Account.count - admin_account_count_was
|
58
|
-
end
|
59
|
-
end
|
data/test/fake_app.rb
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
# config
|
5
|
-
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
6
|
-
|
7
|
-
module ActionArgsTestApp
|
8
|
-
class Application < Rails::Application
|
9
|
-
config.secret_key_base = config.secret_token = [*'A'..'z'].join
|
10
|
-
config.session_store :cookie_store, :key => '_myapp_session'
|
11
|
-
config.active_support.deprecation = :log
|
12
|
-
config.eager_load = false
|
13
|
-
end
|
14
|
-
end
|
15
|
-
ActionArgsTestApp::Application.initialize!
|
16
|
-
|
17
|
-
# routes
|
18
|
-
ActionArgsTestApp::Application.routes.draw do
|
19
|
-
resources :authors
|
20
|
-
resources :books
|
21
|
-
resources :kw_books # 2.0+ only
|
22
|
-
resources :kw_keyreq_books # 2.1+ only
|
23
|
-
resources :stores
|
24
|
-
resources :movies
|
25
|
-
|
26
|
-
namespace :admin do
|
27
|
-
resources :accounts
|
28
|
-
resources :books
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# models
|
33
|
-
class Author < ActiveRecord::Base
|
34
|
-
end
|
35
|
-
class Book < ActiveRecord::Base
|
36
|
-
end
|
37
|
-
class Store < ActiveRecord::Base
|
38
|
-
end
|
39
|
-
class Movie < ActiveRecord::Base
|
40
|
-
has_many :actors
|
41
|
-
accepts_nested_attributes_for :actors
|
42
|
-
end
|
43
|
-
class Actor < ActiveRecord::Base
|
44
|
-
belongs_to :movie
|
45
|
-
end
|
46
|
-
module Admin
|
47
|
-
def self.table_name_prefix() 'admin_' end
|
48
|
-
class Account < ActiveRecord::Base
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# mailers
|
53
|
-
require "action_mailer/railtie"
|
54
|
-
class UserMailer < ActionMailer::Base
|
55
|
-
def send_email_without_args
|
56
|
-
mail(
|
57
|
-
to: 'to@example.com',
|
58
|
-
from: 'from@example.com',
|
59
|
-
subject: 'Action Args!!!',
|
60
|
-
body: 'test'
|
61
|
-
)
|
62
|
-
end
|
63
|
-
|
64
|
-
def send_email_with_optional_args(subject = 'Action Args!!!')
|
65
|
-
mail(
|
66
|
-
to: 'to@example.com',
|
67
|
-
from: 'from@example.com',
|
68
|
-
subject: subject,
|
69
|
-
body: 'test'
|
70
|
-
)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# helpers
|
75
|
-
module ApplicationHelper; end
|
76
|
-
|
77
|
-
# controllers
|
78
|
-
class ApplicationController < ActionController::Base
|
79
|
-
end
|
80
|
-
class AuthorsController < ApplicationController
|
81
|
-
def show
|
82
|
-
@author = Author.find params[:id]
|
83
|
-
render plain: @author.name
|
84
|
-
end
|
85
|
-
end
|
86
|
-
class BooksController < ApplicationController
|
87
|
-
before_action :set_book, only: :show
|
88
|
-
before_action -> { @proc_filter_executed = true }, only: :show
|
89
|
-
if Rails.version < '5.1'
|
90
|
-
before_action '@string_filter_executed = true', only: :show
|
91
|
-
end
|
92
|
-
around_action :benchmark_action
|
93
|
-
before_action :omg
|
94
|
-
skip_before_action :omg
|
95
|
-
|
96
|
-
# optional parameter
|
97
|
-
def index(page = 1, q = nil, limit = 10)
|
98
|
-
@books = Book.limit(limit.to_i).offset(([page.to_i - 1, 0].max) * 10)
|
99
|
-
@books = @books.where('title like ?', "%#{q}%") unless q.blank?
|
100
|
-
render plain: 'index', books: @books
|
101
|
-
end
|
102
|
-
|
103
|
-
def show(id)
|
104
|
-
render plain: @book.title
|
105
|
-
end
|
106
|
-
|
107
|
-
def create(book)
|
108
|
-
book = book.permit :title, :price
|
109
|
-
@book = Book.create! book
|
110
|
-
render plain: @book.title
|
111
|
-
end
|
112
|
-
|
113
|
-
private
|
114
|
-
def set_book(id)
|
115
|
-
@book = Book.find(id)
|
116
|
-
end
|
117
|
-
|
118
|
-
def benchmark_action
|
119
|
-
start = Time.now
|
120
|
-
yield
|
121
|
-
@elapsed_time = Time.now - start
|
122
|
-
end
|
123
|
-
|
124
|
-
def omg
|
125
|
-
raise '💣'
|
126
|
-
end
|
127
|
-
end
|
128
|
-
class MoviesController < ApplicationController
|
129
|
-
permits :title, actors_attributes: [:name]
|
130
|
-
|
131
|
-
def create(movie)
|
132
|
-
@movie = Movie.create! movie
|
133
|
-
render plain: @movie.title
|
134
|
-
end
|
135
|
-
end
|
136
|
-
class StoresController < ApplicationController
|
137
|
-
permits :name, :url
|
138
|
-
|
139
|
-
def show(id)
|
140
|
-
@store = Store.find(id)
|
141
|
-
render plain: @store.name
|
142
|
-
end
|
143
|
-
|
144
|
-
def new(store = {name: 'PragProg'})
|
145
|
-
@store = Store.new store
|
146
|
-
render plain: @store.name
|
147
|
-
end
|
148
|
-
|
149
|
-
def create(store)
|
150
|
-
@store = Store.create! store
|
151
|
-
render plain: @store.name
|
152
|
-
end
|
153
|
-
end
|
154
|
-
module Admin
|
155
|
-
class AccountsController < ::ApplicationController
|
156
|
-
permits :name, model_name: 'Admin::Account'
|
157
|
-
|
158
|
-
def create(admin_account)
|
159
|
-
@admin_account = Admin::Account.create! admin_account
|
160
|
-
render plain: @admin_account.name
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
class BooksController < ::ApplicationController
|
165
|
-
permits :title
|
166
|
-
|
167
|
-
def create(book)
|
168
|
-
@book = Book.create! book
|
169
|
-
render plain: @book.title
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
require_relative 'kwargs_controllers'
|
175
|
-
require_relative 'kwargs_keyreq_controllers' if RUBY_VERSION >= '2.1'
|
176
|
-
|
177
|
-
# migrations
|
178
|
-
class CreateAllTables < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
|
179
|
-
def self.up
|
180
|
-
create_table(:authors) {|t| t.string :name}
|
181
|
-
create_table(:books) {|t| t.string :title; t.integer :price}
|
182
|
-
create_table(:stores) {|t| t.string :name; t.string :url}
|
183
|
-
create_table(:admin_accounts) {|t| t.string :name}
|
184
|
-
create_table(:movies) {|t| t.string :title}
|
185
|
-
create_table(:actors) {|t| t.string :name; t.references :movie}
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
if ActiveRecord::Base.connection.respond_to? :data_source_exists?
|
190
|
-
CreateAllTables.up unless ActiveRecord::Base.connection.data_source_exists? 'authors'
|
191
|
-
else
|
192
|
-
CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'authors'
|
193
|
-
end
|
data/test/kwargs_controllers.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# this file should not be loaded from Ruby <2.0
|
4
|
-
|
5
|
-
class KwBooksController < ApplicationController
|
6
|
-
# keyword arguments
|
7
|
-
def index(author_name, page: '1', q: nil)
|
8
|
-
render plain: {author_name: author_name, page: page, q: q}.inspect
|
9
|
-
end
|
10
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# this file should not be loaded from Ruby <2.1
|
4
|
-
|
5
|
-
class KwKeyreqBooksController < ApplicationController
|
6
|
-
# keyword arguments
|
7
|
-
def index(author_name:, page: '1', q: nil)
|
8
|
-
render plain: {author_name: author_name, page: page, q: q}.inspect
|
9
|
-
end
|
10
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class UserMailerTest < ActionMailer::TestCase
|
6
|
-
test '#send_email_without_args' do
|
7
|
-
#it should not raise NameError: undefined local variable or method `params' for ...
|
8
|
-
assert UserMailer.send_email_without_args
|
9
|
-
end
|
10
|
-
|
11
|
-
test '#send_email_with_optional_args' do
|
12
|
-
#it should not raise NoMethodError: undefined method for nil:NilClass
|
13
|
-
assert UserMailer.send_email_with_optional_args
|
14
|
-
end
|
15
|
-
end
|