Rails state_machine gem を使用しています。ステータス フィールドを持つモデル リードが 1 つあります。state_machine を使用して変更された状態から、以前の状態に変更できますか? 連絡先のチェック ボックスがあります。ユーザーがクリックすると、lead.made_contact になります。しかし、それらがチェックされていない場合は、元に戻す必要があります。state_machine は役に立ちますか? ありがとう。
2 に答える
1
チェックボックスとの相互作用をモデル化している場合、期待できる唯一の遷移はそれを切り替えることだと私には思えます。次に、ステータスメッセージは、このステートマシンの値によって決定される仮想属性にすることができます。
このシナリオでは、ステート マシンはおそらくやり過ぎですが、質問のために問題を単純化していると仮定すると、別の方法があります。
class Lead
state_machine :contact_state, :initial => :unchecked, :namespace => "contact" do
event :toggle do
transition :unchecked => :checked, :unless => lambda {|obj| obj.contact_state }
transition :checked => :unchecked, :if => lambda {|obj| obj.contact_state }
end
state :checked, :value => true
state :unchecked, :value => false
end
def status
contact_state ? "lead.made_contact!" : ""
end
end
そのコードは、次の動作を生成します。もちろん、名前空間や属性を好みに合わせて変更できます。
irb(main):001:0> lead = Lead.new
=> #<Lead:0x007fccec42c898 @contact_state=false>
irb(main):002:0> lead.contact_state
=> false
irb(main):003:0> lead.status
=> ""
irb(main):004:0> lead.toggle_contact
=> true
irb(main):005:0> lead.contact_state
=> true
irb(main):006:0> lead.status
=> "lead.made_contact!"
irb(main):007:0> lead.toggle_contact
=> true
irb(main):008:0> lead.status
=> ""
于 2014-01-20T09:50:13.713 に答える
1
次のように明示的にステップを定義する必要があります。
event :next do
transition from: :without_contact, to: :with_contact
end
event :back do
transition from: :with_contact, to: :without_contact
end
このようにして、あなたができること.next
と.previous
ステート マシンの威力は、オブジェクト自体に処理させる必要があることです。許可された遷移と違法な遷移についてよく考える必要があり、その後はイベントを使用するだけです。
非常に明示的な遷移名を持つことは、多くの場合、抽象化されていないステート マシンの兆候です。(酒宴を見て、基本的には 1 つのイベントを使用します: next
、抽象化は完全です)
于 2013-09-12T12:33:03.437 に答える