rails应用程序中的状态机和参数



我正在使用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

最新更新