module JSONAPI::Serializable::Resource::ConditionalFields
Extension for handling conditional fields in serializable resources.
@usage
class SerializableUser < JSONAPI::Serializable::Resource extend JSONAPI::Serializable::Resource::ConditionalFields attribute :email, if: -> { @current_user.admin? } has_many :friends, unless: -> { @object.private_profile? } end
Attributes
field_condition_blocks[RW]
link_condition_blocks[RW]
Public Class Methods
extended(klass)
click to toggle source
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 24 def self.extended(klass) klass.class_eval do include InstanceMethods class << self attr_accessor :field_condition_blocks attr_accessor :link_condition_blocks end self.field_condition_blocks ||= {} self.link_condition_blocks ||= {} end end
prepended(klass)
click to toggle source
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 15 def self.prepended(klass) warn <<-EOT DERPRECATION WARNING (called from #{caller_locations(1...2).first}): Prepending `#{name}' is deprecated and will be removed in future releases. Use `Object#extend' instead. EOT klass.extend self end
Public Instance Methods
_register_condition(condition_blocks, name, options)
click to toggle source
@api private
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 82 def _register_condition(condition_blocks, name, options) condition_blocks[name.to_sym] = if options.key?(:if) options[:if] elsif options.key?(:unless) proc { !instance_exec(&options[:unless]) } end end
attribute(name, options = {}, &block)
click to toggle source
Handle the `if` and `unless` options for attributes.
@example
attribute :email, if: -> { @current_user.admin? }
Calls superclass method
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 47 def attribute(name, options = {}, &block) super _register_condition(field_condition_blocks, name, options) end
has_many(name, options = {}, &block)
NOTE(beauby): Re-aliasing those is necessary for the
overridden `#relationship` method to be called.
Alias for: relationship
inherited(klass)
click to toggle source
Calls superclass method
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 36 def inherited(klass) super klass.field_condition_blocks = field_condition_blocks.dup klass.link_condition_blocks = link_condition_blocks.dup end
link(name, options = {}, &block)
click to toggle source
Handle the `if` and `unless` options for links.
@example
link :self, if: -> { @object.render_self_link? } do "..." end
Calls superclass method
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 70 def link(name, options = {}, &block) super(name, &block) _register_condition(link_condition_blocks, name, options) end
relationship(name, options = {}, &block)
click to toggle source
Handle the `if` and `unless` options for relationships (has_one
,
belongs_to, has_many).
@example
has_many :friends, unless: -> { @object.private_profile? }
Calls superclass method
# File lib/jsonapi/serializable/resource/conditional_fields.rb, line 58 def relationship(name, options = {}, &block) super _register_condition(field_condition_blocks, name, options) end