使用AASM状态机进行Rails错误处理

时间:2010-01-07 08:27:55

标签: ruby-on-rails state state-machine aasm

我正在使用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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我知道在rubyist-aasm 2.0.2中你可以调用add'!'到转换方法调用,如果转换失败将返回false。所以假设您有一个名为approve的控制器方法:

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

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

让我知道你的想法?