class Rails::Surrender::Render::Resource::Instance

Renders an instance resource

Attributes

ability[R]
config[R]
resource[R]

Public Class Methods

new(resource:, config:, ability:) click to toggle source
# File lib/rails/surrender/render/resource/instance.rb, line 11
def initialize(resource:, config:, ability:)
  @resource = resource
  @config = config
  @ability = ability
end

Public Instance Methods

render() click to toggle source
# File lib/rails/surrender/render/resource/instance.rb, line 17
def render
  config.history.push history_class

  result = {}
  config.locally_included_attributes.each { |attr| result[attr.to_sym] = resource.send(attr) }

  config.locally_included_expands.each_key do |key|
    next if config.exclude_locally?(key)

    nested_resource_class = nested_class_for(resource, key)
    next if config.history.include? nested_resource_class

    nested_config = nested_config_for(nested_resource_class, key)

    if resource.class.reflections[key.to_s].try(:collection?)
      collection = resource.send(key.to_sym).select { |i| ability.can? :read, i }
      result[key] = Collection.new(resource: collection, config: nested_config, ability: ability).render
    else
      instance = resource.send(key)
      next if config.history.include? instance.class

      if ability.can?(:read, instance)
        result[key] = Instance.new(resource: instance, config: nested_config, ability: ability).render
      elsif instance.nil?
        result[key] = nil # represent an associated element as null if it's missing
      end
    end
  end
  result
end

Private Instance Methods

history_class() click to toggle source

get to the root subclass for sti models and store that as history

# File lib/rails/surrender/render/resource/instance.rb, line 68
def history_class
  resource.class.superclass until resource.class.superclass.in? [ActiveRecord::Base, ApplicationRecord]
end
nested_class_for(resource, key) click to toggle source
# File lib/rails/surrender/render/resource/instance.rb, line 50
def nested_class_for(resource, key)
  resource.class.reflections[key.to_s].klass
rescue NoMethodError
  resource.send(key).class
end
nested_config_for(nested_resource_class, key) click to toggle source
# File lib/rails/surrender/render/resource/instance.rb, line 56
def nested_config_for(nested_resource_class, key)
  Configuration.new(
    resource_class: nested_resource_class,
    user_include: config.nested_user_includes[key]  || [],
    ctrl_include: config.nested_ctrl_includes[key]  || [],
    user_exclude: config.nested_user_excludes[key]  || [],
    ctrl_exclude: config.nested_ctrl_excludes[key]  || [],
    history: config.history
  )
end