@@ -47,9 +47,20 @@ def declared_array(passed_params, options, declared_params)
47
47
48
48
def declared_hash ( passed_params , options , declared_params )
49
49
declared_params . each_with_object ( passed_params . class . new ) do |declared_param , memo |
50
- # If it is not a Hash then it does not have children.
51
- # Find its value or set it to nil.
52
- if !declared_param . is_a? ( Hash )
50
+ if declared_param . is_a? ( Hash )
51
+ declared_param . each_pair do |declared_parent_param , declared_children_params |
52
+ next unless options [ :include_missing ] || passed_params . key? ( declared_parent_param )
53
+
54
+ passed_children_params = passed_params [ declared_parent_param ] || passed_params . class . new
55
+ memo_key = optioned_param_key ( declared_parent_param , options )
56
+
57
+ memo [ memo_key ] = handle_passed_param ( declared_parent_param , passed_children_params ) do
58
+ declared ( passed_children_params , options , declared_children_params )
59
+ end
60
+ end
61
+ else
62
+ # If it is not a Hash then it does not have children.
63
+ # Find its value or set it to nil.
53
64
has_alias = route_setting ( :aliased_params ) && route_setting ( :aliased_params ) . find { |current | current [ declared_param ] }
54
65
param_alias = has_alias [ declared_param ] if has_alias
55
66
@@ -60,17 +71,26 @@ def declared_hash(passed_params, options, declared_params)
60
71
else
61
72
memo [ optioned_param_key ( declared_param , options ) ] = passed_params [ declared_param ]
62
73
end
63
- else
64
- declared_param . each_pair do |declared_parent_param , declared_children_params |
65
- next unless options [ :include_missing ] || passed_params . key? ( declared_parent_param )
66
-
67
- passed_children_params = passed_params [ declared_parent_param ] || passed_params . class . new
68
- memo [ optioned_param_key ( declared_parent_param , options ) ] = declared ( passed_children_params , options , declared_children_params )
69
- end
70
74
end
71
75
end
72
76
end
73
77
78
+ def handle_passed_param ( declared_param , passed_children_params , &_block )
79
+ should_be_empty_array? ( declared_param , passed_children_params ) ? [ ] : yield
80
+ end
81
+
82
+ def should_be_empty_array? ( declared_param , passed_children_params )
83
+ declared_param_is_array? ( declared_param ) && passed_children_params . empty?
84
+ end
85
+
86
+ def declared_param_is_array? ( declared_param )
87
+ route_options_params [ declared_param . to_s ] && route_options_params [ declared_param . to_s ] [ :type ] == 'Array'
88
+ end
89
+
90
+ def route_options_params
91
+ options [ :route_options ] [ :params ] || { }
92
+ end
93
+
74
94
def optioned_param_key ( declared_param , options )
75
95
options [ :stringify ] ? declared_param . to_s : declared_param . to_sym
76
96
end
0 commit comments