Skip to content

Commit 8804d75

Browse files
committed
Remove dynamically defined instance methods
1 parent 0bf45ec commit 8804d75

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

lib/active_model/serializer.rb

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,13 @@ def self.attribute(attr, options = {}, &block)
119119
key = options.fetch(:key, attr)
120120
reader = if block
121121
->(instance) { instance.instance_eval(&block) }
122+
elsif _fragmented
123+
->(instance) { instance.class._fragmented.read_attribute_for_serialization(attr) }
122124
else
123-
->(instance) { instance.send(attr) }
125+
->(instance) { instance.read_attribute_for_serialization(attr) }
124126
end
125127

126128
_attribute_mappings[key] = Attribute.new(attr, reader)
127-
128-
ActiveModelSerializers.silence_warnings do
129-
define_method attr do
130-
object.read_attribute_for_serialization(attr)
131-
end unless method_defined?(attr) || _fragmented.respond_to?(attr)
132-
end
133129
end
134130

135131
# @api private
@@ -278,11 +274,15 @@ def json_key
278274
def attributes(requested_attrs = nil)
279275
self.class._attribute_mappings.each_with_object({}) do |(key, attribute_mapping), hash|
280276
next unless requested_attrs.nil? || requested_attrs.include?(key)
281-
if self.class._fragmented
282-
hash[key] = self.class._fragmented.public_send(attribute_mapping.name)
283-
else
284-
hash[key] = attribute_mapping.call(self)
285-
end
277+
hash[key] = attribute_mapping.call(self)
278+
end
279+
end
280+
281+
def read_attribute_for_serialization(attr)
282+
if _serializer_method_defined?(attr)
283+
send(attr)
284+
else
285+
object.read_attribute_for_serialization(attr)
286286
end
287287
end
288288

@@ -295,5 +295,15 @@ def links
295295
protected
296296

297297
attr_accessor :instance_options
298+
299+
private
300+
301+
def _serializer_instance_methods
302+
@_serializer_instance_methods ||= (public_methods - Object.public_instance_methods).to_set
303+
end
304+
305+
def _serializer_method_defined?(name)
306+
_serializer_instance_methods.include?(name)
307+
end
298308
end
299309
end

test/fixtures/poro.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def custom_options
116116
attributes :id, :name, :description, :slug
117117

118118
def slug
119-
"#{name}-#{id}"
119+
"#{object.name}-#{object.id}"
120120
end
121121

122122
belongs_to :author

0 commit comments

Comments
 (0)