| Class | StateMachine::EventCollection |
| In: |
lib/state_machine/event_collection.rb
|
| Parent: | NodeCollection |
Represents a collection of events in a state machine
Gets the transition that should be performed for the event stored in the given object‘s event attribute. This also takes an additional parameter for automatically invalidating the object if the event or transition are invalid. By default, this is turned off.
Note that if a transition has already been generated for the event, then that transition will be used.
class Vehicle < ActiveRecord::Base
state_machine :initial => :parked do
event :ignite do
transition :parked => :idling
end
end
end
vehicle = Vehicle.new # => #<Vehicle id: nil, state: "parked">
events = Vehicle.state_machine.events
vehicle.state_event = nil
events.attribute_transition_for(vehicle) # => nil # Event isn't defined
vehicle.state_event = 'invalid'
events.attribute_transition_for(vehicle) # => false # Event is invalid
vehicle.state_event = 'ignite'
events.attribute_transition_for(vehicle) # => #<StateMachine::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>
# File lib/state_machine/event_collection.rb, line 114
114: def attribute_transition_for(object, invalidate = false)
115: return unless machine.action
116:
117: result = machine.read(object, :event_transition) || if event_name = machine.read(object, :event)
118: if event = self[event_name.to_sym, :name]
119: event.transition_for(object) || begin
120: # No valid transition: invalidate
121: machine.invalidate(object, :event, :invalid_event, [[:state, machine.states.match!(object).human_name(object.class)]]) if invalidate
122: false
123: end
124: else
125: # Event is unknown: invalidate
126: machine.invalidate(object, :event, :invalid) if invalidate
127: false
128: end
129: end
130:
131: result
132: end
Gets the list of transitions that can be run on the given object.
Valid requirement options:
class Vehicle
state_machine :initial => :parked do
event :park do
transition :idling => :parked
end
event :ignite do
transition :parked => :idling
end
end
end
events = Vehicle.state_machine.events
vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
events.transitions_for(vehicle) # => [#<StateMachine::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
vehicle.state = 'idling'
events.transitions_for(vehicle) # => [#<StateMachine::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>]
# Search for explicit transitions regardless of the current state
events.transitions_for(vehicle, :from => :parked) # => [#<StateMachine::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
# File lib/state_machine/event_collection.rb, line 81
81: def transitions_for(object, requirements = {})
82: match(requirements).map {|event| event.transition_for(object, requirements)}.compact
83: end
Gets the list of events that can be fired on the given object.
Valid requirement options:
class Vehicle
state_machine :initial => :parked do
event :park do
transition :idling => :parked
end
event :ignite do
transition :parked => :idling
end
end
end
events = Vehicle.state_machine(:state).events
vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
events.valid_for(vehicle) # => [#<StateMachine::Event name=:ignite transitions=[:parked => :idling]>]
vehicle.state = 'idling'
events.valid_for(vehicle) # => [#<StateMachine::Event name=:park transitions=[:idling => :parked]>]
# File lib/state_machine/event_collection.rb, line 41
41: def valid_for(object, requirements = {})
42: match(requirements).select {|event| event.can_fire?(object, requirements)}
43: end