Module: IOPromise::ViewComponent::DataLoader

Defined in:
lib/iopromise/view_component/data_loader.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



23
24
25
# File 'lib/iopromise/view_component/data_loader.rb', line 23

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#data_as_promiseObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/iopromise/view_component/data_loader.rb', line 27

def data_as_promise
  @data_promise ||= begin
    promises = self.class.promised_data_keys.map do |k|
      p = instance_variable_get('@' + k.to_s)
      if p.is_a?(IOPromise::ViewComponent::DataLoader)
        # recursively preload all nested data
        p.data_as_promise
      else
        # for any local promises, we'll unwrap them before completing
        p.then do |result|
          if result.is_a?(IOPromise::ViewComponent::DataLoader)
            # likewise, if we resolved a promise that we can recurse, load that data too.
            result.data_as_promise
          else
            result
          end
        end
      end
    end

    Promise.all(promises)
  end
end

#render_inObject



56
57
58
59
# File 'lib/iopromise/view_component/data_loader.rb', line 56

def render_in(*)
  sync
  super
end

#syncObject



51
52
53
54
# File 'lib/iopromise/view_component/data_loader.rb', line 51

def sync
  data_as_promise.sync
  self
end