Skip to content

Commit

Permalink
Make json.extract! accept objects with internal hash implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
bacchir committed Jun 20, 2018
1 parent a0dc0bd commit 2543bf2
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
14 changes: 4 additions & 10 deletions lib/jbuilder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -213,10 +213,8 @@ def array!(collection = [], *attributes)
#
# json.(@person, :name, :age)
def extract!(object, *attributes)
if ::Hash === object
_extract_hash_values(object, attributes)
else
_extract_method_values(object, attributes)
attributes.each do |key|
_set_value key, _extract_value(object, key)
end
end

Expand Down Expand Up @@ -252,12 +250,8 @@ def target!

private

def _extract_hash_values(object, attributes)
attributes.each{ |key| _set_value key, object.fetch(key) }
end

def _extract_method_values(object, attributes)
attributes.each{ |key| _set_value key, object.public_send(key) }
def _extract_value(object, attribute)
object.respond_to?(attribute) ? object.public_send(attribute) : object.fetch(attribute)
end

def _merge_block(key)
Expand Down
22 changes: 22 additions & 0 deletions test/jbuilder_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,17 @@ def initialize(name, age)
end
end

class PersonWithHash
attr_reader :name, :collection

def initialize(name, age)
@collection = { age: age }
@name = name
end

delegate :[], :fetch, to: :@collection
end

class RelationMock
include Enumerable

Expand Down Expand Up @@ -121,6 +132,17 @@ class JbuilderTest < ActiveSupport::TestCase
assert_equal 34, result['age']
end

test 'extracting from object with internal hash' do
person = PersonWithHash.new('David', 32)

result = jbuild do |json|
json.extract! person, :name, :age
end

assert_equal 'David', result['name']
assert_equal 32, result['age']
end

test 'nesting single child with block' do
result = jbuild do |json|
json.author do
Expand Down

0 comments on commit 2543bf2

Please sign in to comment.