4

人々がクラスで任意のワークフローを定義できるようにしようとしています。このコードはおそらくスタック オーバーフローには長すぎるので、その要点をまとめました。

コードを実行すると、最初のいくつかのテストは機能しますが、支払い状態に移行しようとするとpayment_required?、完全に間違ったオブジェクトのメソッドがチェックされます。現在のインスタンスでそれをチェックしたいのですOrderが、代わりに(一見)ステートマシンの匿名クラスでそのメソッドを探しています。

Orderインスタンスでメソッドを正しく呼び出すにはどうすればよいですか?

4

2 に答える 2

0

問題は、42行目あたりの匿名ステートマシンの定義にあります。

  order.class.transitions.each { |attrs| transition(attrs) }

これは、遷移ガードがクラスのコンテキストではなく、匿名ステートマシンのコンテキストで評価されることを意味しますOrder

1つの解決策は、トランジションガードを変換することです。上記の行をこれに置き換えて、テストスイートに合格します。

  order.class.transitions.each do |attrs| 
    if attrs[:if].is_a? Symbol
      if_method = attrs[:if]
      attrs[:if] = lambda { order.send( if_method ) } 
    end

    transition(attrs)
  end

完全なソリューションを得るには、すべてのタイプのトランジションガードをサポートする必要があります。StateMachine::EvalHelpers完全なセットを探すことをお勧めします。

修正:

他の人が述べているように、テストスイートも修正する必要があります。

go_to :payment, :if => :payment_required? # Line 107

order.stub :payment_required? => true # Line 142
于 2012-07-06T03:50:45.943 に答える
0

Spree::Orderステート マシンの定義をクラスに移動することで、これを修正しました。このプルリクエストで作品を見ることができます。

于 2012-07-12T07:18:04.367 に答える