module NxtStateMachine::ActiveRecord::InstanceMethods

Private Instance Methods

execute_transition(target, transition, state_attr, save_with_method) click to toggle source
# File lib/nxt_state_machine/integrations/active_record.rb, line 78
def execute_transition(target, transition, state_attr, save_with_method)
  transition.execute do |block|
    result = block ? block.call : nil
    target.assign_attributes(state_attr => transition.to.to_s)
    set_state_result = target.send(save_with_method) || halt_transition
    block ? result : set_state_result
  end
end
lock_transition?(event) click to toggle source
# File lib/nxt_state_machine/integrations/active_record.rb, line 93
def lock_transition?(event)
  event.options.fetch(:lock_transitions) { state_machine.options.fetch(:lock_transitions) }
end
set_state(machine, target, transition, state_attr, save_with_method) click to toggle source
# File lib/nxt_state_machine/integrations/active_record.rb, line 49
def set_state(machine, target, transition, state_attr, save_with_method)
  result = nil
  defused_error = nil

  with_conditional_lock(target, transition.event) do
    transition.run_before_callbacks
    result = execute_transition(target, transition, state_attr, save_with_method)
    transition.run_after_callbacks

    result
  rescue StandardError => error
    if machine.defuse_registry.resolve!(transition).find { |error_class| error.is_a?(error_class) }
      defused_error = error
    else
      raise error
    end
  end

  raise defused_error if defused_error

  transition.run_success_callbacks || result
rescue StandardError => error
  target.assign_attributes(state_attr => transition.from.to_s)

  raise unless save_with_method == :save && error.is_a?(NxtStateMachine::Errors::TransitionHalted)

  false
end
with_conditional_lock(target, event, &block) click to toggle source
# File lib/nxt_state_machine/integrations/active_record.rb, line 87
def with_conditional_lock(target, event, &block)
  return block.call unless lock_transition?(event)

  target.with_lock { block.call }
end