6

Event オブジェクトのさまざまな状態 (イベントの初期化、イベントの議論、イベントの公開など) を処理するためにruby​​ist-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
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

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

どう考えているか教えてください?

于 2010-01-07T10:06:42.660 に答える