Module: ViewModel::ActiveRecord::CollectionNestedController

Extended by:
ActiveSupport::Concern
Includes:
NestedControllerBase
Included in:
Controller
Defined in:
lib/view_model/active_record/collection_nested_controller.rb

Overview

Inherits the following routes to manipulate children directly: POST /children #create – create or update without parent GET /children #index – list all child models regardless of parent GET /children/:id #show DELETE /children/:id #destroy

Instance Method Summary collapse

Instance Method Details

#append(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context) ⇒ Object

Deserialize items of the associated type and append them to the owner’s collection.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/view_model/active_record/collection_nested_controller.rb', line 41

def append(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
  assoc_view = nil
  pre_rendered = owner_viewmodel.transaction do
    update_hash, refs = parse_viewmodel_updates

    before = parse_relative_position(:before)
    after  = parse_relative_position(:after)

    if before && after
      raise ViewModel::DeserializationError::InvalidSyntax.new("Can not provide both `before` and `after` anchors for a collection append")
    end

    owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)

    assoc_view = owner_view.append_associated(association_name,
                                              update_hash,
                                              references: refs,
                                              before:     before,
                                              after:      after,
                                              deserialize_context: deserialize_context)
    ViewModel::Callbacks.wrap_serialize(owner_view, context: serialize_context) do
      child_context = owner_view.context_for_child(association_name, context: serialize_context)
      ViewModel.preload_for_serialization(assoc_view, serialize_context: child_context)
      assoc_view = yield(assoc_view) if block_given?
      prerender_viewmodel(assoc_view, serialize_context: child_context)
    end
  end
  render_json_string(pre_rendered)
  assoc_view
end

#disassociate(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context) ⇒ Object



72
73
74
75
76
77
78
# File 'lib/view_model/active_record/collection_nested_controller.rb', line 72

def disassociate(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
  owner_viewmodel.transaction do
    owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
    owner_view.delete_associated(association_name, viewmodel_id, type: viewmodel_class, deserialize_context: deserialize_context)
    render_viewmodel(nil)
  end
end

#disassociate_all(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context) ⇒ Object



35
36
37
# File 'lib/view_model/active_record/collection_nested_controller.rb', line 35

def disassociate_all(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
  destroy_association(true, serialize_context: serialize_context, deserialize_context: deserialize_context)
end

#index_associated(scope: nil, serialize_context: new_serialize_context, &block) ⇒ Object



25
26
27
# File 'lib/view_model/active_record/collection_nested_controller.rb', line 25

def index_associated(scope: nil, serialize_context: new_serialize_context, &block)
  show_association(scope: scope, serialize_context: serialize_context, &block)
end

#replace(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, &block) ⇒ Object

Deserialize items of the associated type and associate them with the owner, replacing previously associated items.



31
32
33
# File 'lib/view_model/active_record/collection_nested_controller.rb', line 31

def replace(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, &block)
  write_association(serialize_context: serialize_context, deserialize_context: deserialize_context, &block)
end