2010-01-07 4 views
5

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

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

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 

ответ

0

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

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

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

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

+0

Спасибо, это будет работать в контроллере, но я хотел бы сохранить эти вещи в модели. С вашим решением я все еще мог бы использовать переход в другой модели без прохождения проверки. – Cimm

+1

А, ок. IMO охранник на самом деле не является ошибкой проверки в отношении модели AR, но это защитник, который просто защищает переход от происходящего на конечной машине, лично я был бы счастлив назвать! метод (в другой модели или контроллере) и проверку возврата. Вы не можете «увидеть» что-то, если не спросите правильно? Я мог быть совершенно неправым, поэтому я буду рад узнать, возникают ли какие-либо другие решения. Если вы действительно хотите получить ошибку проверки, вы можете добавить что-то вроде validates_presence_of: price,: if => "self.second_state?" – tsdbrown

2

С 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