class StrongResources::StrongResource

Attributes

attributes[RW]
customized_actions[R]
destroy[RW]
disassociate[RW]
except[RW]
jsonapi_type[R]
name[R]
only[RW]
relation_type[RW]
relations[RW]

Public Class Methods

from(name, opts = {}, &blk) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 12
def self.from(name, opts = {}, &blk)
  config   = StrongResources.find(name)
  resource = new(name)
  resource.instance_eval(&config[:base])
  resource.instance_eval(&blk) if blk
  resource
end
new(name) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 20
def initialize(name)
  @name = name
  @jsonapi_type = name.to_s.pluralize
  @customized_actions = {}
  self.attributes = {}
  self.relations = {}
end

Public Instance Methods

attribute(name, type, opts = {}) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 44
def attribute(name, type, opts = {})
  self.attributes[name] = { type: type, if: opts[:if] }
end
belongs_to(name, resource: nil, only: nil, except: nil, disassociate: false, destroy: false, &blk) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 78
def belongs_to(name,
               resource: nil,
               only: nil,
               except: nil,
               disassociate: false,
               destroy: false,
               &blk)
  resource_name = resource || name
  related_resource = self.class.from(resource_name, &blk)
  add_relation(name, related_resource, only, except, disassociate, destroy)
end
destroy?() click to toggle source
# File lib/strong_resources/strong_resource.rb, line 40
def destroy?
  !!@destroy
end
disassociate?() click to toggle source
# File lib/strong_resources/strong_resource.rb, line 36
def disassociate?
  !!@disassociate
end
has_many(name, resource: nil, only: nil, except: nil, disassociate: false, destroy: false, &blk) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 64
def has_many(name,
             resource: nil,
             only: nil,
             except: nil,
             disassociate: false,
             destroy: false,
             &blk)
  resource_name = resource || name.to_s.singularize.to_sym
  related_resource = self.class.from(resource_name)
  related_resource.instance_eval(&blk) if block_given?
  related_resource.relation_type = :has_many
  add_relation(name, related_resource, only, except, disassociate, destroy)
end
has_many?() click to toggle source
# File lib/strong_resources/strong_resource.rb, line 60
def has_many?
  relation_type == :has_many
end
has_one(*args, &blk) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 90
def has_one(*args, &blk)
  belongs_to(*args, &blk)
end
on(action_name, &blk) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 56
def on(action_name, &blk)
  self.customized_actions[action_name] = blk
end
permits(controller) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 94
def permits(controller)
  base_permits(self, controller).tap do |permits|
    permits[:relationships] ||= {}
    self.relations.each_pair do |relation_name, opts|
      related_resource = opts[:resource]
      related = related_permits(related_resource, controller)
      
      permits[:relationships][relation_name] = related
      permits
    end
  end
end
remove_attribute(name) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 48
def remove_attribute(name)
  self.attributes.delete(name)
end
remove_relationship(name) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 52
def remove_relationship(name)
  self.relations.delete(name)
end

Private Instance Methods

add_relation(name, resource, only, except, disassociate, destroy) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 139
def add_relation(name, resource, only, except, disassociate, destroy)
  resource.only = only
  resource.except = except
  resource.disassociate = disassociate
  resource.destroy = destroy

  self.relations[name] = {
    resource: resource
  }
end
base_permits(resource, controller) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 109
def base_permits(resource, controller)
  permits = {}
  permits.merge!(id: StrongResources.type_for_param(:id))
  resource.attributes.each_pair do |name, opts|
    next if (opts[:if] and opts[:if].call(controller) == false)
    permits.merge!(name => StrongResources.type_for_param(opts[:type]))
  end

  permits = permits.slice(*resource.only) if resource.only
  permits = permits.except(*resource.except) if resource.except
  permits
end
merge_disassociate_destroy(related_resource, permits) click to toggle source
# File lib/strong_resources/strong_resource.rb, line 129
def merge_disassociate_destroy(related_resource, permits)
  if related_resource.disassociate?
    permits.merge!(_disassociate: true)
  end

  if related_resource.destroy?
    permits.merge!(_destroy: true)
  end
end