aasm_state setter (또는 예제에서는 상태) 모델을 덮어 쓰면 이벤트 이름을 사용할 수 있습니다. 그런 다음 유효한 이벤트인지 확인한 다음 전환이 유효한지 확인합니다. 일치하지 않으면 올바른 오류 메시지를 추가합니다.
요청 스펙이 경우에 당신이 "에 상태"X "에서 전환을하지 않을 수도 있다는 모델 사양
it "should invoke the cancel method" do
campaign.update_attribute(:status, "cancel")
campaign.canceled?.should be_true
end
it "should add an error for illegal transition" do
campaign.update_attribute(:status, "complete")
campaign.errors.should include :status
campaign.errors[:status].should == ["status cannot transition from pending to complete"]
end
it "should add an error for invalid status type" do
campaign.update_attribute(:status, "foobar")
campaign.errors.should include :status
campaign.errors[:status].should == ["status of foobar is not valid. Legal values are pending, active, canceled, completed"]
end
모델은
class Campaign < ActiveRecord::Base
include AASM
aasm column: :status do
state :pending, :initial => true
state :active
state :canceled
state :completed
# Events
event :activate do
transitions from: :pending, to: :active
end
event :complete do
transitions from: :active, to: [:completed]
end
event :cancel do
transitions from: [:pending, :active], to: :canceled
end
end
def status=(value)
if self.class.method_defined?(value)
if self.send("may_#{value}?")
self.send(value)
else
errors.add(:status, "status cannot transition from #{status} to #{value}")
end
else
errors.add(:status, "status of #{value} is not valid. Legal values are #{aasm.states.map(&:name).join(", ")}")
end
end
end
참고
출판 "하고 AASM은 예외를 제기 할 것입니다. 그렇지 않으면 합리적으로 들립니다. 오늘 아침에 니키 피커 야. – jaydel
이건 의사 코드 야. 이것은 일반적인 패턴을 설명하기위한 것입니다. – Wukerplank