Два конечных автомата в классе Single ruby - PullRequest
0 голосов
/ 10 ноября 2011

Ниже приведены технические характеристики системы: =

  • Язык 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
...