Обработка ошибок Rails с помощью конечного автомата AASM - PullRequest
6 голосов
/ 07 января 2010

Я использую конечный автомат rubyist-aasm для обработки различных состояний в моем объекте Event (событие инициализировано, событие обсуждено, событие опубликовано и т. Д.). Я добавил защиту, чтобы предотвратить изменение состояния, когда определенные условия не выполняются.

Это все работает нормально, но не показывает никаких ошибок, когда охранник отклонил изменение состояния. Любая идея, как я могу видеть состояние не изменилось? Я мог бы проверить состояния вручную, но это звучит как уродливое решение.

aasm_state :firststate 
aasm_state :secondstate  

aasm_event :approve do
  transitions :to => :secondstate, :from => [:firststate], :guard => :has_a_price? 
end

def has_a_price?   
  self.price.present?
end

Ответы [ 2 ]

3 голосов
/ 27 сентября 2010

С SimpleStateMachine вы можете защитить переходы состояний, добавив ошибки:

def approve
  errors.add(:price, 'Invalid') if price.blank?
end
event :approve, :firststate => :secondstate

Хотя в этом случае имеющаяся цена не связана с событием, поэтому этого будет достаточно:

validates_presence_of :price, :if => "self.second_state?"
event :approve, :firststate => :secondstate
1 голос
/ 07 января 2010

Я знаю, что в rubyist-aasm 2.0.2 вы можете позвонить добавить '!' к вызову метода перехода, который вернет false, если переход не удался. Допустим, у вас есть метод контроллера с именем Approve:

def approve
  @event = Event.find params[:id]

  if @event.approve!
    # transition occurred
  else
    # handle the failed transition (flash or errors)
  end
end

Дайте мне знать, что вы думаете?

...