rails 应用中的状态机和参数

State machine and params in a rails app

我正在使用 AASM 为具有订阅行为的模型实现状态机。我希望状态机能够在更改状态时触发操作。

目前我使用更新操作,如果由于回调而日期不正确,该操作将会失败。

class Contrat
  validate :active_start_is_valid
end

我想使用状态机,但我想象的所有实现对我来说似乎都很混乱:

-我用这种方法创建了一个class方法或一个服务对象:

def start_subscription(date)   
  date = validate_input_date(date)   
  @contrat.start_date=date   
  @contrat.activate! 
end

-用于激活的控制器操作是一个有限的更新操作(使用自定义参数要求过滤),它将执行类似的操作:

if @contrat.update_attributes
  @contrat.activate!
end

我真的对这些中的任何一个都不满意。状态机文章,无论 rails 与否,从不提及事件的参数,还有其他一些我应该注意的模式吗?

我是不是遗漏了什么明显的东西?

这不是你应该如何实现状态机, 你应该创建你的模型,状态字段指示记录的状态然后决定对象的状态是什么并使用转换:

如果要指示初始状态,请使用:

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