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]

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
belongs_to(name, options = {}, &block)
Alias for: relationship
has_many(name, options = {}, &block)

NOTE(beauby): Re-aliasing those is necessary for the

overridden `#relationship` method to be called.
Alias for: relationship
has_one(name, options = {}, &block)
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
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
Also aliased as: has_many, has_one, belongs_to