Class: Plutonium::Interaction::Base

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Attributes, ActiveModel::Model, Definition::ConfigAttr, Definition::DefineableProps, Definition::Presentable, Definition::StructuredInputs
Defined in:
lib/plutonium/interaction/base.rb

Overview

Note:

Subclasses must implement the #execute method.

Base class for all interactions. Provides core functionality for validations, execution, and result handling.

Examples:

class MyInteraction < Plutonium::Interaction::Base
  attribute :user_id, :integer
  validates :user_id, presence: true

  private

  def execute
    user = User.find(user_id)
    success(user)
  end
end

Direct Known Subclasses

Resource::Interaction

Defined Under Namespace

Classes: Form

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Definition::StructuredInputs

#defined_structured_inputs

Methods included from Definition::Presentable

#description, #icon, #label

Constructor Details

#initialize(view_context:, **attributes) ⇒ Base

Returns a new instance of Base.



60
61
62
63
# File 'lib/plutonium/interaction/base.rb', line 60

def initialize(view_context:, **attributes)
  super(attributes)
  @view_context = view_context
end

Instance Attribute Details

#view_contextObject (readonly)

Returns the value of attribute view_context.



58
59
60
# File 'lib/plutonium/interaction/base.rb', line 58

def view_context
  @view_context
end

Class Method Details

.build_form(instance) ⇒ Object

Raises:

  • (ArgumentError)


48
49
50
51
52
# File 'lib/plutonium/interaction/base.rb', line 48

def build_form(instance)
  raise ArgumentError, "instance is required" unless instance

  self::Form.new(instance)
end

.callObject



44
45
46
# File 'lib/plutonium/interaction/base.rb', line 44

def call(...)
  new(...).call
end

.structured_input(name, **options, &block) ⇒ Object

On interactions, declaring a structured input also declares the backing ActiveModel attribute so the value survives ‘attributes=` and appears in `attribute_names` (which drives the interaction form’s field list).



33
34
35
36
37
# File 'lib/plutonium/interaction/base.rb', line 33

def self.structured_input(name, **options, &block)
  super
  default = options[:repeat] ? -> { [] } : -> { {} }
  attribute name, default: default
end

Instance Method Details

#build_formObject



65
66
67
# File 'lib/plutonium/interaction/base.rb', line 65

def build_form
  self.class.build_form(self)
end

#callPlutonium::Interaction::Outcome

Executes the interaction.

Returns:



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/plutonium/interaction/base.rb', line 72

def call
  if valid?
    outcome = execute
    unless outcome.is_a?(Plutonium::Interaction::Outcome)
      raise "#{self.class}#execute must return an instance of Plutonium::Interaction::Outcome.\n" \
            "#{outcome.inspect} received instead"
    end
    outcome
  else
    failure.with_message("An error occurred")
  end
end