Skip to content

Commit 4a6be72

Browse files
committed
Merge pull request ruby-grape#62 from AlexYankee/issue_with_nested_attributes
Issue with nested attributes
2 parents b880080 + 72f83ba commit 4a6be72

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

lib/grape_entity/entity.rb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ def self.expose(*args, &block)
141141
unless @nested_attributes.empty?
142142
attribute = "#{@nested_attributes.last}__#{attribute}"
143143
options[:nested] = true
144-
nested_exposures[@nested_attributes.last.to_sym] ||= {}
145-
nested_exposures[@nested_attributes.last.to_sym][attribute.to_sym] = options
144+
nested_exposures_hash[@nested_attributes.last.to_sym] ||= {}
145+
nested_exposures_hash[@nested_attributes.last.to_sym][attribute.to_sym] = options
146146
end
147147

148148
exposures[attribute.to_sym] = options
@@ -184,14 +184,22 @@ def self.exposures
184184
@exposures
185185
end
186186

187-
def self.nested_exposures
188-
@nested_exposures ||= {}
187+
class << self
188+
attr_accessor :_nested_exposures_hash
189189

190-
if superclass.respond_to? :nested_exposures
191-
@nested_exposures = superclass.nested_exposures.merge(@nested_exposures)
190+
def nested_exposures_hash
191+
self._nested_exposures_hash ||= {}
192192
end
193193

194-
@nested_exposures
194+
def nested_exposures
195+
value = nested_exposures_hash
196+
197+
if superclass.respond_to? :nested_exposures
198+
value = superclass.nested_exposures.merge(value)
199+
end
200+
201+
value
202+
end
195203
end
196204

197205
# Returns a hash, the keys are symbolized references to fields in the entity,

spec/grape_entity/entity_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,42 @@ class BogusEntity < Grape::Entity
130130
}
131131
end
132132

133+
it "complex nested attributes" do
134+
class ClassRoom < Grape::Entity
135+
expose(:parents, using: 'Parent') { |_| [{}, {}] }
136+
end
137+
138+
class Person < Grape::Entity
139+
expose :user do
140+
expose(:id) { |_| 'value' }
141+
end
142+
end
143+
144+
class Student < Person
145+
expose :user do
146+
expose(:user_id) { |_| 'value' }
147+
expose(:user_display_id, as: :display_id) { |_| 'value' }
148+
end
149+
end
150+
151+
class Parent < Person
152+
expose(:children, using: 'Student') { |_| [{}, {}] }
153+
end
154+
155+
ClassRoom.represent({}).serializable_hash.should == {
156+
parents: [
157+
{
158+
user: { id: "value" },
159+
children: [{ user: { user_id: "value", display_id: "value" } }, { user: { user_id: "value", display_id: "value" } }]
160+
},
161+
{
162+
user: { id: "value" },
163+
children: [{ user: { user_id: "value", display_id: "value" } }, { user: { user_id: "value", display_id: "value" } }]
164+
}
165+
]
166+
}
167+
end
168+
133169
it 'is safe if its nested exposures are safe' do
134170
subject.with_options safe: true do
135171
subject.expose :awesome do

0 commit comments

Comments
 (0)