class ViewModel::TraversalContext
Abstract base for Serialize and DeserializeContexts.
Attributes
Public Class Methods
new(shared_context: nil, **shared_context_params)
click to toggle source
Calls superclass method
# File lib/view_model/traversal_context.rb, line 31 def initialize(shared_context: nil, **shared_context_params) super() @shared_context = shared_context || self.class.shared_context_class.new(**shared_context_params) @parent_context = nil @parent_viewmodel = nil @parent_association = nil @root = true end
new_child(...)
click to toggle source
# File lib/view_model/traversal_context.rb, line 27 def self.new_child(...) self.allocate.tap { |c| c.initialize_as_child(...) } end
Public Instance Methods
for_child(parent_viewmodel, association_name:, **rest)
click to toggle source
# File lib/view_model/traversal_context.rb, line 51 def for_child(parent_viewmodel, association_name:, **rest) self.class.new_child( shared_context: shared_context, parent_context: self, parent_viewmodel: parent_viewmodel, parent_association: association_name, **rest) end
for_references()
click to toggle source
Obtain a semi-independent context for descending through a shared reference: keep the same shared context, but drop any tree location specific local context (since a shared reference could equally have been reached via any parent)
# File lib/view_model/traversal_context.rb, line 64 def for_references self.class.new(shared_context: shared_context) end
initialize_as_child(shared_context:, parent_context:, parent_viewmodel:, parent_association:)
click to toggle source
Overloaded constructor for initialization of descendent node contexts. Shared context is the same, ancestry is established, and subclasses can override to maintain other node-specific state.
# File lib/view_model/traversal_context.rb, line 43 def initialize_as_child(shared_context:, parent_context:, parent_viewmodel:, parent_association:) @shared_context = shared_context @parent_context = parent_context @parent_viewmodel = parent_viewmodel @parent_association = parent_association @root = false end
nearest_root()
click to toggle source
# File lib/view_model/traversal_context.rb, line 112 def nearest_root if root? self else parent_context&.nearest_root end end
nearest_root_viewmodel()
click to toggle source
# File lib/view_model/traversal_context.rb, line 120 def nearest_root_viewmodel if root? raise RuntimeError.new('Attempted to find nearest root from a root context. This is probably not what you wanted.') elsif parent_context.root? parent_viewmodel else parent_context.nearest_root_viewmodel end end
parent_association(idx = 0)
click to toggle source
# File lib/view_model/traversal_context.rb, line 84 def parent_association(idx = 0) if idx == 0 @parent_association else parent_context(idx - 1)&.parent_association end end
parent_context(idx = 0)
click to toggle source
# File lib/view_model/traversal_context.rb, line 68 def parent_context(idx = 0) if idx == 0 @parent_context else @parent_context&.parent_context(idx - 1) end end
parent_ref(idx = 0)
click to toggle source
# File lib/view_model/traversal_context.rb, line 92 def parent_ref(idx = 0) parent_viewmodel(idx)&.to_reference end
parent_viewmodel(idx = 0)
click to toggle source
# File lib/view_model/traversal_context.rb, line 76 def parent_viewmodel(idx = 0) if idx == 0 @parent_viewmodel else parent_context(idx - 1)&.parent_viewmodel end end
root?()
click to toggle source
# File lib/view_model/traversal_context.rb, line 108 def root? @root end
run_callback(hook, view, **args)
click to toggle source
# File lib/view_model/traversal_context.rb, line 96 def run_callback(hook, view, **args) # Run in-viewmodel callback hooks before context hooks, as they are # permitted to alter the model. if view.respond_to?(hook.dsl_viewmodel_callback_method) view.public_send(hook.dsl_viewmodel_callback_method, hook.context_name => self, **args) end callbacks.each do |callback| callback.run_callback(hook, view, self, **args) end end