Ниже приведены технические характеристики системы: =
- Язык Ruby
- Framework Padrino
- ORM Mongoid
- База данных MongoDB
Теперь у меня есть модель Person с двумя полями, которые поддерживают состояния по отдельности.
class Person
include Mongoid::Document
include Mongoid::Timestamps
# Field Names
#-----------------
field :name, :type => String
field :sms_state, :type => String, :default => 'main_menu'
field :ivr_state, :type => String, :default => 'main_menu'
end
Я добавляю конечные автоматы, используя Monkey Patching, так как мне нужно обновить состояние в соответствии с контроллером запроса.т. е. если запрашивается контроллер SMS, то Monkey Patched должен использовать только конечный автомат SMS для sms_state и аналогичным образом для контроллера IVR я выполняю исправление Monkey Patching таким образом (причина для установки Monkey PAtching, поскольку весь поток и состояния конечного автомата одинаковы, за исключением поля состояния,и события меняются ...)
Person.class_eval do
state_machine :state_field, :initial => :main_menu do
# State Machine Flow
# Events Details
#===============================================================
event :state_reset do
transition all - [:country_confirmation, :topup_confirmation] => :main_menu
end
event :country_list do
transition [:main_menu, :did_purchased, :country_probed] => :country_listed
end
# States Details
#===============================================================================
state :main_menu do
define_method (:get_msg) {|obj| current_module.get_main_menu_msg(obj.dids.count, obj.spokn_id) }
end
state :country_listed do
define_method (:get_msg) {|obj| current_module.get_country_list_msg Country.all }
end
end
end
Но он отлично работает только для конечного автомата.Предположим, что он работает нормально для контроллера SMS, и если запрос поступает от контроллера IVR, конечный автомат Ivr будет исправлен.Но State State не делает, и я получаю следующее сообщение об ошибке
StateMachine::InvalidTransition - Cannot transition sms_state via :ivr_country_list from :country_listed