@@ -47,9 +47,20 @@ def declared_array(passed_params, options, declared_params)
4747
4848 def declared_hash ( passed_params , options , declared_params )
4949 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.
5364 has_alias = route_setting ( :aliased_params ) && route_setting ( :aliased_params ) . find { |current | current [ declared_param ] }
5465 param_alias = has_alias [ declared_param ] if has_alias
5566
@@ -60,17 +71,26 @@ def declared_hash(passed_params, options, declared_params)
6071 else
6172 memo [ optioned_param_key ( declared_param , options ) ] = passed_params [ declared_param ]
6273 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
7074 end
7175 end
7276 end
7377
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+
7494 def optioned_param_key ( declared_param , options )
7595 options [ :stringify ] ? declared_param . to_s : declared_param . to_sym
7696 end
0 commit comments