государственная машина, условные переходы - PullRequest
0 голосов
/ 29 мая 2010

Я сейчас использую Рабочий процесс .

class Link < ActiveRecord::Base
  include Workflow
  workflow do
    state :new do
      event :process, :transitions_to => :checking #checking http_response_code & content_type
    end

    state :checking do
      event :process, :transitions_to => :fetching_links # fetching all links
    end
    state :fetching_links do
      event :process, :transitions_to => :checking #ready for next check
    end
  end
end

Теперь я могу сделать:

l = Link.new
l.process!
l.process!
l.process!
l.process!
# n times l.process! (in a loop, or cron job for example)

Но это может произойти, какая-то ссылка не будет отвечатьили дать мне неправильный ответ во время процесса проверки.

Как я могу условно переключиться в другое состояние?

Я имею в виду что-то вроде этого:

class Link < ActiveRecord::Base
  include Workflow
  workflow do
    state :new do
      event :process, :transitions_to => :checking #checking http_response_code & content_type
    end

    state :checking do
      event :process, :transitions_to => :fetching_links # if all is fine
      event :process, :transitions_to => :failded # if something goes wrong
    end
    state :fetching_links do
      event :process, :transitions_to => :checking #ready for next check
    end
  end
end

1 Ответ

1 голос
/ 30 мая 2010

Я не уверен, где выполняются ваши действия. on_entry или on_exit состояния.

То, что я предположил, было бы лучше, это то, что при переходе в мое следующее состояние, если произошла какая-то ошибка, я мог бы перейти в другое состояние, например :failed. Я не пробовал это, но я обнаружил, что вы можете halt перейти в состояние, что означает, что переход не удался.

Например:

state :checking do
  event :process, :transitions_to => :fetching_links do
    fetch_links
    halt if fetch_links_failed? 
  end
end

Вы бы использовали это следующим образом:

l.process
l.halted? => true # if fetching_links failed

Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...