class Pakyow::Reflection::Builders::Actions

@api private

Public Instance Methods

build(actions) click to toggle source
# File lib/pakyow/reflection/builders/actions.rb, line 13
def build(actions)
  actions.each do |action|
    define_action(action)
  end
end

Private Instance Methods

define_action(action) click to toggle source
# File lib/pakyow/reflection/builders/actions.rb, line 21
def define_action(action)
  if action.parents.any?
    parents = action.parents.dup

    current_resource = ensure_controller_has_helpers(
      find_or_define_resource_for_scope_at_path(parents.shift, action.view_path)
    )

    parents.each do |parent|
      current_resource = ensure_controller_has_helpers(
        find_or_define_resource_for_scope_in_resource(parent, current_resource)
      )
    end

    resource = find_or_define_resource_for_scope_in_resource(action.scope, current_resource)
  else
    resource = find_or_define_resource_for_scope_at_path(action.scope, action.view_path)
  end

  ensure_controller_has_helpers(resource)

  # Define the route unless it exists.
  #
  # Actions are easy since they always go in the resource controller for
  # the scope. If a nested scope, the action is defined on the nested
  # resource returned by `find_or_define_resource_for_scope`.
  #
  route = resource.routes.values.flatten.find { |possible_route|
    possible_route.name == action.name
  } || resource.send(action.name) do
    reflect
  end

  # Install the reflect action if it hasn't been installed for this route.
  #
  if route.name
    unless action.node.labeled?(:endpoint)
      form_endpoint_name = [resource.name_of_self.to_s, route.name.to_s].join("_").to_sym
      action.node.significance << :endpoint
      action.node.set_label(:endpoint, form_endpoint_name)
      action.node.attributes[:"data-e"] = form_endpoint_name
    end

    resource.action :set_reflected_action, only: [route.name] do
      if connection.form
        form_view_path = connection.form[:view_path]
        form_binding = connection.form[:binding]&.to_sym

        connection.set(:__reflected_action, action.scope.actions.find { |possible_action|
          possible_action.view_path == form_view_path && possible_action.binding == form_binding
        })
      end
    end
  else
    # TODO: warn the user that a reflection couldn't be installed for an unnamed route
  end
end