before_filter не работает в state_machine :( - PullRequest
1 голос
/ 19 февраля 2010

У меня есть модель, которая использует state_machine для управления различными состояниями. Одно конкретное событие требует before_transition, так как ему нужно создать таблицу соединения перед выполнением перехода. К сожалению, это не работает.

class DocumentSet < ActiveRecord::Base

  state_machine :state, :initial => :draft do
    # Callbacks
    before_transition :on=>:submit, :do=>:populate_join_table

    # States
    state :draft
    state :submitted

    # Events
    event :submit do transition :draft=>:submitted, :if=>:can_submit? end
  end

def populate_join_table
   puts '::::::::: INSIDE POPULATE_JOIN_TABLE'
end

def can_submit?    
  raise "Document Set has no Document(s)" if self.document_versions.blank?
  true
end

Теперь, когда я делаю DocumentSet.submit, он фактически никогда не входит в populate_join_table, так как он оценивает can_submit? как ложь.

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010

Думаю, я нашел решение. По сути, происходит то, что state_machine сначала оценивает условие: if, а только затем - before_transition.

Итак, заказ:

If (GuardCondition == true)
  run before_transition
  run transition
  run before_transition
1 голос
/ 22 февраля 2010

Защитное условие (я) контролирует, действительно ли это событие (и переход) действительны в это время. В этом случае ваш охранник возвращает false, поэтому вы не будете переходить. Это может быть чрезвычайно полезно, но в вашем случае вам может понадобиться переделать / переосмыслить вещи, чтобы запустить этот обратный вызов.

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