6

我正在使用ruby​​ist-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
4

2 回答 2

3

使用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
于 2010-09-27T19:38:19.627 回答
1

我知道在 ruby​​ist-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

让我知道你的想法?

于 2010-01-07T10:06:42.660 回答