Условная проверка с помощью state_machine - PullRequest
6 голосов
/ 24 декабря 2010

Я использую state_machine для создания многошаговой формы с полями для каждого шага, проверенными перед переходом к следующему шагу.

Это моя модель:

class Foo < ActiveRecord::Base
  state_machine :initial => :step1 do
    event :next do
      transition :step1 => :step2
      transition :step2 => :step3
    end
    event :previous do
      transition :step3 => :step2
      transition :step2 => :step1
    end

    state :step1 do 
      validates_presence_of :field1
    end
    state :step2 do 
      validates_presence_of :field2
    end
    state :step3 do 
      validates_presence_of :field3
    end
  end  
end

Однако это не работает должным образом:

> f = Foo.new
=> #<Foo id: nil, field1: nil, field2: nil, field3: nil, state: "step1", created_at: nil, updated_at: nil>

Foo инициализируется с состоянием 'step1'.Пока все хорошо.

> f.next
=> false

Переход к следующему шагу завершается неудачно из-за проверки, как и ожидалось.

> f.errors.full_messages 
=> ["Field2 can't be blank"]

Однако, когда я проверяю ошибки проверки, это не так«Поле1», которое не удалось проверить, как ожидалось, а «Поле2».Похоже, что он выполняет проверки состояния, в которое выполняется переход, а не текущего состояния.

Что я делаю не так?

Большое спасибо.

1 Ответ

6 голосов
/ 24 декабря 2010

Я просто догадываюсь, здесь, но, возможно, он запускает проверку в

state :step2 do 
  validates_presence_of :field2
end

при попытке перейти к шагу 2?

Возможно, вам не нужна проверка на шагеодин, а вернем все проверки на один шаг:

state :step2 do 
  validates_presence_of :field1
end
state :step3 do 
  validates_presence_of :field2
end
state :final do 
  validates_presence_of :field3
end
...