我正在使用AASM将状态机实现到具有订阅行为的模型。我希望状态机能够在改变状态时触发动作。
目前我使用一个更新操作,如果由于回调而导致日期不正确,则该操作将失败。
class Contrat
validate :active_start_is_valid
end
我想使用状态机,但我想象的所有实现对我来说都很混乱:
-I使用这种方法创建一个类方法或服务对象:
def start_subscription(date)
date = validate_input_date(date)
@contrat.start_date=date
@contrat.activate!
end
- 我在before_save方法中这样做,该方法将由更新触发。这个更复杂,因为我需要检查start_date是否已经更改,如果是,我检查日期并更新它,然后再更改状态。
-激活的控制器动作是一个有限的更新动作(用自定义参数要求过滤),它将做类似的事情:
if @contrat.update_attributes
@contrat.activate!
end
我真的不喜欢这些。关于状态机的文章,无论是否为rails,都从未提到过事件的参数,我是否应该注意其他模式?
我错过了什么明显的吗?
你不应该这样实现状态机,你应该创建你的模型,并且state字段指示记录的状态,然后决定对象的状态是什么,并使用transition:
如果您想指示初始状态,请使用:
state_machine :state, initial: :started do
...
end
如果你想创建过渡:
event :start do
transition [:created] => :started
end
做过渡工作:
after_transition [:created] => :started, do: :send_mail
阅读更多:
https://github.com/pluginaweek/state_machine