strongly_typed_parameters 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +90 -0
- data/Rakefile +28 -0
- data/lib/action_controller/parameters.rb +240 -0
- data/lib/active_model/forbidden_attributes_protection.rb +15 -0
- data/lib/generators/rails/USAGE +12 -0
- data/lib/generators/rails/strong_parameters_controller_generator.rb +17 -0
- data/lib/generators/rails/templates/controller.rb +94 -0
- data/lib/strongly_typed_parameters.rb +4 -0
- data/lib/strongly_typed_parameters/boolean.rb +12 -0
- data/lib/strongly_typed_parameters/railtie.rb +17 -0
- data/lib/strongly_typed_parameters/version.rb +3 -0
- data/test/action_controller_required_params_test.rb +30 -0
- data/test/action_controller_tainted_params_test.rb +25 -0
- data/test/active_model_mass_assignment_taint_protection_test.rb +30 -0
- data/test/active_model_smart_type_defaulting_test.rb +28 -0
- data/test/controller_generator_test.rb +38 -0
- data/test/gemfiles/Gemfile.rails-3.0.x +6 -0
- data/test/gemfiles/Gemfile.rails-3.0.x.lock +62 -0
- data/test/gemfiles/Gemfile.rails-3.1.x +6 -0
- data/test/gemfiles/Gemfile.rails-3.2.x +6 -0
- data/test/log_on_unpermitted_params_test.rb +50 -0
- data/test/multi_parameter_attributes_test.rb +38 -0
- data/test/parameters_permit_test.rb +264 -0
- data/test/parameters_require_test.rb +10 -0
- data/test/parameters_taint_test.rb +93 -0
- data/test/raise_on_unpermitted_params_test.rb +33 -0
- data/test/test_helper.rb +36 -0
- metadata +171 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
|
3
|
+
module StronglyTypedParameters
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
if config.respond_to?(:app_generators)
|
6
|
+
config.app_generators.scaffold_controller = :strongly_typed_parameters_controller
|
7
|
+
else
|
8
|
+
config.generators.scaffold_controller = :strongly_typed_parameters_controller
|
9
|
+
end
|
10
|
+
|
11
|
+
initializer "strong_parameters.config", :before => "action_controller.set_configs" do |app|
|
12
|
+
ActionController::Parameters.action_on_unpermitted_parameters = app.config.action_controller.delete(:action_on_unpermitted_parameters) do
|
13
|
+
(Rails.env.test? || Rails.env.development?) ? :log : false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BooksController < ActionController::Base
|
4
|
+
def create
|
5
|
+
params.require(:book).require(:name)
|
6
|
+
head :ok
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class ActionControllerRequiredParamsTest < ActionController::TestCase
|
11
|
+
tests BooksController
|
12
|
+
|
13
|
+
test "missing required parameters will raise exception" do
|
14
|
+
post :create, { :magazine => { :name => "Mjallo!" } }
|
15
|
+
assert_response :bad_request
|
16
|
+
|
17
|
+
post :create, { :book => { :title => "Mjallo!" } }
|
18
|
+
assert_response :bad_request
|
19
|
+
end
|
20
|
+
|
21
|
+
test "required parameters that are present will not raise" do
|
22
|
+
post :create, { :book => { :name => "Mjallo!" } }
|
23
|
+
assert_response :ok
|
24
|
+
end
|
25
|
+
|
26
|
+
test "missing parameters will be mentioned in the return" do
|
27
|
+
post :create, { :magazine => { :name => "Mjallo!" } }
|
28
|
+
assert_equal "Required parameter missing: book", response.body
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class PeopleController < ActionController::Base
|
4
|
+
def create
|
5
|
+
render :text => params[:person].permitted? ? "untainted" : "tainted"
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_with_permit
|
9
|
+
render :text => params[:person].permit(:name).permitted? ? "untainted" : "tainted"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class ActionControllerTaintedParamsTest < ActionController::TestCase
|
14
|
+
tests PeopleController
|
15
|
+
|
16
|
+
test "parameters are tainted" do
|
17
|
+
post :create, { :person => { :name => "Mjallo!" } }
|
18
|
+
assert_equal "tainted", response.body
|
19
|
+
end
|
20
|
+
|
21
|
+
test "parameters can be permitted and are then not tainted" do
|
22
|
+
post :create_with_permit, { :person => { :name => "Mjallo!" } }
|
23
|
+
assert_equal "untainted", response.body
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Person
|
4
|
+
include ActiveModel::MassAssignmentSecurity
|
5
|
+
include ActiveModel::ForbiddenAttributesProtection
|
6
|
+
|
7
|
+
public :sanitize_for_mass_assignment
|
8
|
+
end
|
9
|
+
|
10
|
+
class ActiveModelMassUpdateProtectionTest < ActiveSupport::TestCase
|
11
|
+
test "forbidden attributes cannot be used for mass updating" do
|
12
|
+
assert_raises(ActiveModel::ForbiddenAttributes) do
|
13
|
+
Person.new.sanitize_for_mass_assignment(ActionController::Parameters.new(:a => "b"))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
test "permitted attributes can be used for mass updating" do
|
18
|
+
assert_nothing_raised do
|
19
|
+
assert_equal({ "a" => "b" },
|
20
|
+
Person.new.sanitize_for_mass_assignment(ActionController::Parameters.new(:a => "b").permit(:a)))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
test "regular attributes should still be allowed" do
|
25
|
+
assert_nothing_raised do
|
26
|
+
assert_equal({ :a => "b" },
|
27
|
+
Person.new.sanitize_for_mass_assignment(:a => "b"))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'action_controller/parameters'
|
3
|
+
|
4
|
+
class Column
|
5
|
+
attr_accessor :name
|
6
|
+
attr_accessor :klass
|
7
|
+
def initialize(hsh)
|
8
|
+
hsh.each do |name, klass|
|
9
|
+
@name = name
|
10
|
+
@klass = klass
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class User
|
16
|
+
def self.columns
|
17
|
+
[Column.new("id" => Fixnum), Column.new("name" => String)]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class ActiveModelSmartTypeDefaultingTest < ActiveSupport::TestCase
|
22
|
+
test "if no types are given but the parent object shares a name with a model, attribute types are used" do
|
23
|
+
params = ActionController::Parameters.new(:user => [:id => 1234])
|
24
|
+
permitted = params.permit(:user => [:id, :name])
|
25
|
+
assert_equal permitted[:user][0][:id], 1234
|
26
|
+
assert_nil permitted[:user][0][:name]
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#FIXME: This errors due to Mocha.
|
2
|
+
|
3
|
+
=begin
|
4
|
+
|
5
|
+
require 'rails/generators/test_case'
|
6
|
+
require 'generators/rails/strong_parameters_controller_generator'
|
7
|
+
|
8
|
+
class StrongParametersControllerGeneratorTest < Rails::Generators::TestCase
|
9
|
+
tests Rails::Generators::StrongParametersControllerGenerator
|
10
|
+
arguments %w(User name:string age:integer --orm=none)
|
11
|
+
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
12
|
+
setup :prepare_destination
|
13
|
+
|
14
|
+
def test_controller_content
|
15
|
+
Rails.stubs(:application).returns(nil)
|
16
|
+
run_generator
|
17
|
+
|
18
|
+
assert_file "app/controllers/users_controller.rb" do |content|
|
19
|
+
|
20
|
+
assert_instance_method :create, content do |m|
|
21
|
+
assert_match '@user = User.new(user_params)', m
|
22
|
+
assert_match '@user.save', m
|
23
|
+
assert_match '@user.errors', m
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_instance_method :update, content do |m|
|
27
|
+
assert_match '@user = User.find(params[:id])', m
|
28
|
+
assert_match '@user.update_attributes(user_params)', m
|
29
|
+
assert_match '@user.errors', m
|
30
|
+
end
|
31
|
+
|
32
|
+
assert_match 'def user_params', content
|
33
|
+
assert_match 'params.require(:user).permit(:age, :name)', content
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
=end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/strong_parameters
|
3
|
+
specs:
|
4
|
+
strong_parameters (0.1.6.dev)
|
5
|
+
actionpack (~> 3.0)
|
6
|
+
activemodel (~> 3.0)
|
7
|
+
railties (~> 3.0)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
abstract (1.0.0)
|
13
|
+
actionpack (3.0.17)
|
14
|
+
activemodel (= 3.0.17)
|
15
|
+
activesupport (= 3.0.17)
|
16
|
+
builder (~> 2.1.2)
|
17
|
+
erubis (~> 2.6.6)
|
18
|
+
i18n (~> 0.5.0)
|
19
|
+
rack (~> 1.2.5)
|
20
|
+
rack-mount (~> 0.6.14)
|
21
|
+
rack-test (~> 0.5.7)
|
22
|
+
tzinfo (~> 0.3.23)
|
23
|
+
activemodel (3.0.17)
|
24
|
+
activesupport (= 3.0.17)
|
25
|
+
builder (~> 2.1.2)
|
26
|
+
i18n (~> 0.5.0)
|
27
|
+
activesupport (3.0.17)
|
28
|
+
builder (2.1.2)
|
29
|
+
erubis (2.6.6)
|
30
|
+
abstract (>= 1.0.0)
|
31
|
+
i18n (0.5.0)
|
32
|
+
json (1.7.5)
|
33
|
+
metaclass (0.0.1)
|
34
|
+
mocha (0.12.7)
|
35
|
+
metaclass (~> 0.0.1)
|
36
|
+
rack (1.2.5)
|
37
|
+
rack-mount (0.6.14)
|
38
|
+
rack (>= 1.0.0)
|
39
|
+
rack-test (0.5.7)
|
40
|
+
rack (>= 1.0)
|
41
|
+
railties (3.0.17)
|
42
|
+
actionpack (= 3.0.17)
|
43
|
+
activesupport (= 3.0.17)
|
44
|
+
rake (>= 0.8.7)
|
45
|
+
rdoc (~> 3.4)
|
46
|
+
thor (~> 0.14.4)
|
47
|
+
rake (10.0.1)
|
48
|
+
rdoc (3.12)
|
49
|
+
json (~> 1.4)
|
50
|
+
thor (0.14.6)
|
51
|
+
tzinfo (0.3.35)
|
52
|
+
|
53
|
+
PLATFORMS
|
54
|
+
ruby
|
55
|
+
|
56
|
+
DEPENDENCIES
|
57
|
+
actionpack (~> 3.0.0)
|
58
|
+
activemodel (~> 3.0.0)
|
59
|
+
mocha (~> 0.12.0)
|
60
|
+
railties (~> 3.0.0)
|
61
|
+
rake
|
62
|
+
strong_parameters!
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'action_controller/parameters'
|
3
|
+
|
4
|
+
class LogOnUnpermittedParamsTest < ActiveSupport::TestCase
|
5
|
+
def setup
|
6
|
+
ActionController::Parameters.action_on_unpermitted_parameters = :log
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
ActionController::Parameters.action_on_unpermitted_parameters = false
|
11
|
+
end
|
12
|
+
|
13
|
+
test "logs on unexpected params" do
|
14
|
+
params = ActionController::Parameters.new({
|
15
|
+
:book => { :pages => 65 },
|
16
|
+
:fishing => "Turnips"
|
17
|
+
})
|
18
|
+
|
19
|
+
assert_logged("Unpermitted parameters: fishing") do
|
20
|
+
params.permit(:book => [:pages])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
test "logs on unexpected nested params" do
|
25
|
+
params = ActionController::Parameters.new({
|
26
|
+
:book => { :pages => 65, :title => "Green Cats and where to find then." }
|
27
|
+
})
|
28
|
+
|
29
|
+
assert_logged("Unpermitted parameters: title") do
|
30
|
+
params.permit(:book => [:pages => Numeric])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def assert_logged(message)
|
37
|
+
old_logger = ActionController::Base.logger
|
38
|
+
log = StringIO.new
|
39
|
+
ActionController::Base.logger = Logger.new(log)
|
40
|
+
|
41
|
+
begin
|
42
|
+
yield
|
43
|
+
|
44
|
+
log.rewind
|
45
|
+
assert_match message, log.read
|
46
|
+
ensure
|
47
|
+
ActionController::Base.logger = old_logger
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'action_controller/parameters'
|
3
|
+
|
4
|
+
class MultiParameterAttributesTest < ActiveSupport::TestCase
|
5
|
+
test "permitted multi-parameter attribute keys" do
|
6
|
+
params = ActionController::Parameters.new({
|
7
|
+
:book => {
|
8
|
+
"shipped_at(1i)" => "2012",
|
9
|
+
"shipped_at(2i)" => "3",
|
10
|
+
"shipped_at(3i)" => "25",
|
11
|
+
"shipped_at(4i)" => "10",
|
12
|
+
"shipped_at(5i)" => "15",
|
13
|
+
"published_at(1i)" => "1999",
|
14
|
+
"published_at(2i)" => "2",
|
15
|
+
"published_at(3i)" => "5",
|
16
|
+
"price(1)" => "R$",
|
17
|
+
"price(2f)" => "2.02"
|
18
|
+
}
|
19
|
+
})
|
20
|
+
permitted = params.permit :book => [ :shipped_at, :price ]
|
21
|
+
|
22
|
+
assert permitted.permitted?
|
23
|
+
|
24
|
+
assert_equal "2012", permitted[:book]["shipped_at(1i)"]
|
25
|
+
assert_equal "3", permitted[:book]["shipped_at(2i)"]
|
26
|
+
assert_equal "25", permitted[:book]["shipped_at(3i)"]
|
27
|
+
assert_equal "10", permitted[:book]["shipped_at(4i)"]
|
28
|
+
assert_equal "15", permitted[:book]["shipped_at(5i)"]
|
29
|
+
|
30
|
+
assert_equal "R$", permitted[:book]["price(1)"]
|
31
|
+
assert_equal "2.02", permitted[:book]["price(2f)"]
|
32
|
+
|
33
|
+
assert_nil permitted[:book]["published_at(1i)"]
|
34
|
+
assert_nil permitted[:book]["published_at(2i)"]
|
35
|
+
assert_nil permitted[:book]["published_at(3i)"]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,264 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'action_controller/parameters'
|
3
|
+
require 'action_dispatch/http/upload'
|
4
|
+
|
5
|
+
class NestedParametersTest < ActiveSupport::TestCase
|
6
|
+
def assert_filtered_out(params, key)
|
7
|
+
assert !params.has_key?(key), "key #{key.inspect} has not been filtered out"
|
8
|
+
end
|
9
|
+
|
10
|
+
#
|
11
|
+
# --- Basic interface --------------------------------------------------------
|
12
|
+
#
|
13
|
+
|
14
|
+
# --- nothing ----------------------------------------------------------------
|
15
|
+
|
16
|
+
test 'if nothing is permitted, the hash becomes empty' do
|
17
|
+
params = ActionController::Parameters.new(:id => '1234')
|
18
|
+
permitted = params.permit
|
19
|
+
permitted.permitted?
|
20
|
+
permitted.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
# --- key --------------------------------------------------------------------
|
24
|
+
|
25
|
+
test 'key: unexpected types are filtered out' do
|
26
|
+
params = ActionController::Parameters.new(:id => 1234, :token => 0)
|
27
|
+
permitted = params.permit(:id => Numeric, :token => String)
|
28
|
+
assert_equal 1234, permitted[:id]
|
29
|
+
assert_filtered_out permitted, :token
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'key: unknown keys are filtered out' do
|
33
|
+
params = ActionController::Parameters.new(:id => '1234', :injected => 'injected')
|
34
|
+
permitted = params.permit(:id)
|
35
|
+
assert_equal '1234', permitted[:id]
|
36
|
+
assert_filtered_out permitted, :injected
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'key: arrays are filtered out' do
|
40
|
+
[[], [1], ['1']].each do |array|
|
41
|
+
params = ActionController::Parameters.new(:id => array)
|
42
|
+
permitted = params.permit(:id)
|
43
|
+
assert_filtered_out permitted, :id
|
44
|
+
|
45
|
+
%w(i f).each do |suffix|
|
46
|
+
params = ActionController::Parameters.new("foo(000#{suffix})" => array)
|
47
|
+
permitted = params.permit(:foo)
|
48
|
+
assert_filtered_out permitted, "foo(000#{suffix})"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'key: hashes are filtered out' do
|
54
|
+
[{}, {:foo => 1}, {:foo => 'bar'}].each do |hash|
|
55
|
+
params = ActionController::Parameters.new(:id => hash)
|
56
|
+
permitted = params.permit(:id)
|
57
|
+
assert_filtered_out permitted, :id
|
58
|
+
|
59
|
+
%w(i f).each do |suffix|
|
60
|
+
params = ActionController::Parameters.new("foo(000#{suffix})" => hash)
|
61
|
+
permitted = params.permit(:foo)
|
62
|
+
assert_filtered_out permitted, "foo(000#{suffix})"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
test 'key: non-permitted scalar values are filtered out' do
|
68
|
+
params = ActionController::Parameters.new(:id => Object.new)
|
69
|
+
permitted = params.permit(:id)
|
70
|
+
assert_filtered_out permitted, :id
|
71
|
+
|
72
|
+
%w(i f).each do |suffix|
|
73
|
+
params = ActionController::Parameters.new("foo(000#{suffix})" => Object.new)
|
74
|
+
permitted = params.permit(:foo)
|
75
|
+
assert_filtered_out permitted, "foo(000#{suffix})"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'key: Boolean matches only true and false' do
|
80
|
+
params = ActionController::Parameters.new(:happy => true)
|
81
|
+
permitted = params.permit(:happy => Boolean)
|
82
|
+
assert_equal true, permitted[:happy]
|
83
|
+
|
84
|
+
params = ActionController::Parameters.new(:happy => false)
|
85
|
+
permitted = params.permit(:happy => Boolean)
|
86
|
+
assert_equal false, permitted[:happy]
|
87
|
+
|
88
|
+
params = ActionController::Parameters.new(:happy => Object.new)
|
89
|
+
permitted = params.permit(:happy => Boolean)
|
90
|
+
assert_filtered_out permitted, :happy
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
test 'key: it is not assigned if not present in params' do
|
95
|
+
params = ActionController::Parameters.new(:name => 'Joe')
|
96
|
+
permitted = params.permit(:id)
|
97
|
+
assert !permitted.has_key?(:id)
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# --- Nesting ----------------------------------------------------------------
|
102
|
+
#
|
103
|
+
|
104
|
+
test "permitted nested parameters" do
|
105
|
+
params = ActionController::Parameters.new({
|
106
|
+
:book => {
|
107
|
+
:title => "Romeo and Juliet",
|
108
|
+
:authors => [{
|
109
|
+
:name => "William Shakespeare",
|
110
|
+
:born => "1564-04-26"
|
111
|
+
}, {
|
112
|
+
:name => "Christopher Marlowe"
|
113
|
+
}, {
|
114
|
+
:name => %w(malicious injected names)
|
115
|
+
}],
|
116
|
+
:details => {
|
117
|
+
:pages => 200,
|
118
|
+
:genre => "Tragedy"
|
119
|
+
}
|
120
|
+
},
|
121
|
+
:magazine => "Mjallo!"
|
122
|
+
})
|
123
|
+
|
124
|
+
permitted = params.permit :book => [ :title, { :authors => [ :name ] }, { :details => {:pages => Numeric} } ]
|
125
|
+
|
126
|
+
assert permitted.permitted?
|
127
|
+
assert_equal "Romeo and Juliet", permitted[:book][:title]
|
128
|
+
assert_equal "William Shakespeare", permitted[:book][:authors][0][:name]
|
129
|
+
assert_equal "Christopher Marlowe", permitted[:book][:authors][1][:name]
|
130
|
+
assert_equal 200, permitted[:book][:details][:pages]
|
131
|
+
|
132
|
+
assert_filtered_out permitted[:book][:authors][2], :name
|
133
|
+
|
134
|
+
assert_filtered_out permitted, :magazine
|
135
|
+
assert_filtered_out permitted[:book][:details], :genre
|
136
|
+
assert_filtered_out permitted[:book][:authors][0], :born
|
137
|
+
end
|
138
|
+
|
139
|
+
test "permitted nested parameters with a string or a symbol as a key" do
|
140
|
+
params = ActionController::Parameters.new({
|
141
|
+
:book => {
|
142
|
+
'authors' => [
|
143
|
+
{ :name => "William Shakespeare", :born => "1564-04-26" },
|
144
|
+
{ :name => "Christopher Marlowe" }
|
145
|
+
]
|
146
|
+
}
|
147
|
+
})
|
148
|
+
|
149
|
+
permitted = params.permit :book => [ { 'authors' => [ :name ] } ]
|
150
|
+
|
151
|
+
assert_equal "William Shakespeare", permitted[:book]['authors'][0][:name]
|
152
|
+
assert_equal "William Shakespeare", permitted[:book][:authors][0][:name]
|
153
|
+
assert_equal "Christopher Marlowe", permitted[:book]['authors'][1][:name]
|
154
|
+
assert_equal "Christopher Marlowe", permitted[:book][:authors][1][:name]
|
155
|
+
|
156
|
+
permitted = params.permit :book => [ { :authors => [ :name ] } ]
|
157
|
+
|
158
|
+
assert_equal "William Shakespeare", permitted[:book]['authors'][0][:name]
|
159
|
+
assert_equal "William Shakespeare", permitted[:book][:authors][0][:name]
|
160
|
+
assert_equal "Christopher Marlowe", permitted[:book]['authors'][1][:name]
|
161
|
+
assert_equal "Christopher Marlowe", permitted[:book][:authors][1][:name]
|
162
|
+
end
|
163
|
+
|
164
|
+
test "nested arrays with strings" do
|
165
|
+
params = ActionController::Parameters.new({
|
166
|
+
:book => {
|
167
|
+
:genres => ["Tragedy"]
|
168
|
+
}
|
169
|
+
})
|
170
|
+
|
171
|
+
permitted = params.permit :book => {:genres => [String]}
|
172
|
+
assert_equal ["Tragedy"], permitted[:book][:genres]
|
173
|
+
end
|
174
|
+
|
175
|
+
test "permit may specify symbols or strings" do
|
176
|
+
params = ActionController::Parameters.new({
|
177
|
+
:book => {
|
178
|
+
:title => "Romeo and Juliet",
|
179
|
+
:author => "William Shakespeare"
|
180
|
+
},
|
181
|
+
:magazine => "Shakespeare Today"
|
182
|
+
})
|
183
|
+
|
184
|
+
permitted = params.permit({ :book => ["title", :author] }, "magazine")
|
185
|
+
assert_equal "Romeo and Juliet", permitted[:book][:title]
|
186
|
+
assert_equal "William Shakespeare", permitted[:book][:author]
|
187
|
+
assert_equal "Shakespeare Today", permitted[:magazine]
|
188
|
+
end
|
189
|
+
|
190
|
+
test "nested array with strings that should be hashes" do
|
191
|
+
params = ActionController::Parameters.new({
|
192
|
+
:book => {
|
193
|
+
:genres => ["Tragedy"]
|
194
|
+
}
|
195
|
+
})
|
196
|
+
|
197
|
+
permitted = params.permit :book => { :genres => :type }
|
198
|
+
assert permitted[:book][:genres].empty?
|
199
|
+
end
|
200
|
+
|
201
|
+
test "nested array with strings that should be hashes and additional values" do
|
202
|
+
params = ActionController::Parameters.new({
|
203
|
+
:book => {
|
204
|
+
:title => "Romeo and Juliet",
|
205
|
+
:genres => ["Tragedy"]
|
206
|
+
}
|
207
|
+
})
|
208
|
+
|
209
|
+
permitted = params.permit :book => [ :title, { :genres => :type } ]
|
210
|
+
assert_equal "Romeo and Juliet", permitted[:book][:title]
|
211
|
+
assert permitted[:book][:genres].empty?
|
212
|
+
end
|
213
|
+
|
214
|
+
test "nested string that should be a hash" do
|
215
|
+
params = ActionController::Parameters.new({
|
216
|
+
:book => {
|
217
|
+
:genre => "Tragedy"
|
218
|
+
}
|
219
|
+
})
|
220
|
+
|
221
|
+
permitted = params.permit :book => { :genre => :type }
|
222
|
+
assert_nil permitted[:book][:genre]
|
223
|
+
end
|
224
|
+
|
225
|
+
test "fields_for_style_nested_params" do
|
226
|
+
params = ActionController::Parameters.new({
|
227
|
+
:book => {
|
228
|
+
:authors_attributes => {
|
229
|
+
:'0' => { :name => 'William Shakespeare', :age_of_death => '52' },
|
230
|
+
:'1' => { :name => 'Unattributed Assistant' },
|
231
|
+
:'2' => { :name => %w(injected names)}
|
232
|
+
}
|
233
|
+
}
|
234
|
+
})
|
235
|
+
permitted = params.permit :book => { :authors_attributes => [ :name ] }
|
236
|
+
|
237
|
+
assert_not_nil permitted[:book][:authors_attributes]['0']
|
238
|
+
assert_not_nil permitted[:book][:authors_attributes]['1']
|
239
|
+
assert permitted[:book][:authors_attributes]['2'].empty?
|
240
|
+
assert_equal 'William Shakespeare', permitted[:book][:authors_attributes]['0'][:name]
|
241
|
+
assert_equal 'Unattributed Assistant', permitted[:book][:authors_attributes]['1'][:name]
|
242
|
+
|
243
|
+
assert_filtered_out permitted[:book][:authors_attributes]['0'], :age_of_death
|
244
|
+
end
|
245
|
+
|
246
|
+
test "fields_for_style_nested_params with negative numbers" do
|
247
|
+
params = ActionController::Parameters.new({
|
248
|
+
:book => {
|
249
|
+
:authors_attributes => {
|
250
|
+
:'-1' => { :name => 'William Shakespeare', :age_of_death => '52' },
|
251
|
+
:'-2' => { :name => 'Unattributed Assistant' }
|
252
|
+
}
|
253
|
+
}
|
254
|
+
})
|
255
|
+
permitted = params.permit :book => { :authors_attributes => [:name] }
|
256
|
+
|
257
|
+
assert_not_nil permitted[:book][:authors_attributes]['-1']
|
258
|
+
assert_not_nil permitted[:book][:authors_attributes]['-2']
|
259
|
+
assert_equal 'William Shakespeare', permitted[:book][:authors_attributes]['-1'][:name]
|
260
|
+
assert_equal 'Unattributed Assistant', permitted[:book][:authors_attributes]['-2'][:name]
|
261
|
+
|
262
|
+
assert_filtered_out permitted[:book][:authors_attributes]['-1'], :age_of_death
|
263
|
+
end
|
264
|
+
end
|