Comments (3)
Found the restore!
method and the section in the doc about persisting state with ActiveRecord.
The constructor for the class inheriting from FiniteMachine::Definition,
for example, Engine
class Engine < FiniteMachine::Definition
returns a class FiniteMachine::StateMachine
when called new
on it. The new
takes any number of arguments, and any initialize
method of the class is never called.
Here is output from the program that follows:
GSM class is FiniteMachine::StateMachine
GSM current state is red
.gems/gems/finite_machine-0.10.1/lib/finite_machine/state_machine.rb:259:in `valid_state?': inappropriate current state 'red' (FiniteMachine::InvalidStateError)
require 'finite_machine'
class GenericStateMachine < FiniteMachine::Definition
initial :red
def initialize(light)
puts "INITIALIZER WITH #{light}"
super
restore! light.state
target light
end
events {
event :start, :red => :green
event :stop, :green => :red
}
callbacks {
on_enter { |event| target.state = event.to }
}
end
class Light
attr_accessor :state
def initialize
state = 'green'
end
def to_s
"Light in state #{state}"
end
end
light = Light.new
gsm = GenericStateMachine.new(light)
puts "GSM class is #{gsm.class.to_s}"
puts "GSM current state is #{gsm.current}"
gsm.stop
puts "GSM state after stop is #{gsm.current}"
puts "Light state after stop is #{light.state}"
from finite_machine.
What works better is to make a state machine factory, that uses the DSL via FiniteMachine.define
https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)
Here is output from the program that follows:
CREATING MACHINE with Light in state green
GSM class is FiniteMachine::StateMachine
GSM current state is green
GSM state after stop is red
Light state after stop is red
require 'finite_machine'
class LightMachineFactory
def self.create_machine(light)
FiniteMachine.define do
puts "CREATING MACHINE with #{light}"
initial light.state
target light
events {
event :start, :red => :green
event :stop, :green => :red
}
callbacks {
on_enter { |event| target.state = event.to }
}
end
end
end
class Light
attr_accessor :state
def initialize
@state = 'green'
end
def to_s
"Light in state #{state}"
end
def state
@state.to_sym
end
end
light = Light.new
gsm = LightMachineFactory.create_machine(light)
puts "GSM class is #{gsm.class.to_s}"
puts "GSM current state is #{gsm.current}"
gsm.stop
puts "GSM state after stop is #{gsm.current}"
puts "Light state after stop is #{light.state}"
from finite_machine.
Reposted at stackoverflow as http://stackoverflow.com/questions/31040725/peter-murach-finite-machine-restore-persisted-state
from finite_machine.
Related Issues (20)
- Remove on_transition callback HOT 5
- Cancelling inside callbacks HOT 3
- Consider removing the conversion of event names into methods. HOT 1
- Repo description url is broken HOT 1
- Website for the gem is not working HOT 1
- Terminal state HOT 4
- When an error occurs on transition the current state is not "rollback" HOT 2
- https://travis-ci.org/minad/moneta
- Ruby 2.6.0 support (ruby-2.6.0-preview3) HOT 1
- Defining helper methods on machine, not on target HOT 2
- Setting target that responds to to_hash HOT 1
- v0.12.1 missing sync dependency HOT 4
- Java::JavaUtilConcurrent::RejectedExecutionException on jruby HOT 1
- Message Queue Spec sometimes hangs on jruby HOT 2
- alias_target doesn't seem to work HOT 2
- [ Feature Request ] Handling For Multiple State Machines HOT 3
- Unable to define constructors on custom classes HOT 4
- Base class events are not overrided in subclass.
- Errors with Ruby 3.1.2 HOT 2
- Transition does not happen if any_state is used in the definition. HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from finite_machine.