From a502b5d38ba289b7aa14cbb35e143e464ca7f64f Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Wed, 30 Dec 2015 17:19:50 +0100 Subject: [PATCH] Add support for if/unless on attributes. --- lib/active_model/serializer/attribute.rb | 29 ++++++++++++++++++++++- lib/active_model/serializer/attributes.rb | 3 ++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializer/attribute.rb b/lib/active_model/serializer/attribute.rb index 5c9893ca..23d2b3d6 100644 --- a/lib/active_model/serializer/attribute.rb +++ b/lib/active_model/serializer/attribute.rb @@ -1,6 +1,6 @@ module ActiveModel class Serializer - Attribute = Struct.new(:name, :block) do + Attribute = Struct.new(:name, :options, :block) do def value(serializer) if block serializer.instance_eval(&block) @@ -8,6 +8,33 @@ module ActiveModel serializer.read_attribute_for_serialization(name) end end + + def included?(serializer) + case condition + when :if + serializer.public_send(condition) + when :unless + !serializer.public_send(condition) + else + true + end + end + + private + + def condition_type + if options.key?(:if) + :if + elsif options.key?(:unless) + :unless + else + :none + end + end + + def condition + options[condition_type] + end end end end diff --git a/lib/active_model/serializer/attributes.rb b/lib/active_model/serializer/attributes.rb index f57ab205..6962f5ac 100644 --- a/lib/active_model/serializer/attributes.rb +++ b/lib/active_model/serializer/attributes.rb @@ -17,6 +17,7 @@ module ActiveModel def attributes(requested_attrs = nil, reload = false) @attributes = nil if reload @attributes ||= self.class._attributes_data.each_with_object({}) do |(key, attr), hash| + next unless attr.included?(self) next unless requested_attrs.nil? || requested_attrs.include?(key) hash[key] = attr.value(self) end @@ -54,7 +55,7 @@ module ActiveModel # end def attribute(attr, options = {}, &block) key = options.fetch(:key, attr) - _attributes_data[key] = Attribute.new(attr, block) + _attributes_data[key] = Attribute.new(attr, options, block) end # @api private