Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions lib/react.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,19 @@ module React
# @param props [Object] If it's a Hash or Array, it will be recursed. Otherwise it will be returned.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inline docs here.

# @return [Hash] a new hash whose keys are camelized strings
def self.camelize_props(props)
case props
props_as_json = props.as_json

case props_as_json
when Hash
props.each_with_object({}) do |(key, value), new_props|
props_as_json.each_with_object({}) do |(key, value), new_props|
new_key = key.to_s.camelize(:lower)
new_value = camelize_props(value)
new_props[new_key] = new_value
end
when Array
props.map { |item| camelize_props(item) }
props_as_json.map { |item| camelize_props(item) }
else
if defined?(ActionController::Parameters) && props.is_a?(ActionController::Parameters)
camelize_props(props.to_h)
else
props
end
props_as_json
end
end
end
32 changes: 31 additions & 1 deletion test/react_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def test_it_camelizes_props
[{ 'nestedArray' => {} }]
]
},
'alreadyCamelized' => :ok
'alreadyCamelized' => 'ok'
}

assert_equal expected_props, React.camelize_props(raw_props)
Expand All @@ -47,4 +47,34 @@ def test_it_camelizes_params

assert_equal expected_params, React.camelize_props(permitted_params)
end

def test_it_camelizes_json_serializable_objects
my_json_serializer = Class.new do
def initialize(data)
@data = data
end

def as_json
@data
end
end

raw_props = {
key_one: 'value1',
key_two: my_json_serializer.new(
nested_key_one: 'nested_value1',
nested_key_two: ['nested', 'value', 'two']
)
}

expected_params = {
'keyOne' => 'value1',
'keyTwo' => {
'nestedKeyOne' => 'nested_value1',
'nestedKeyTwo' => ['nested', 'value', 'two']
}
}

assert_equal expected_params, React.camelize_props(raw_props)
end
end