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

Ruby on rails rails应用程序中的状态机和参数,ruby-on-rails,state,Ruby On Rails,State,我正在使用AASM为具有订阅行为的模型实现状态机。我希望状态机能够在更改状态时触发操作 目前,由于回调,如果日期不正确,我使用的更新操作将失败 class Contrat validate :active_start_is_valid end 我想使用状态机,但我想象的所有实现在我看来都很混乱: -我使用这种方法创建类方法或服务对象: def start_subscription(date) date = validate_input_date(date) @contr

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

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

class Contrat
  validate :active_start_is_valid
end
我想使用状态机,但我想象的所有实现在我看来都很混乱:

-我使用这种方法创建类方法或服务对象:

def start_subscription(date)   
  date = validate_input_date(date)   
  @contrat.start_date=date   
  @contrat.activate! 
end
  • 我在更新触发的before_save方法中执行此操作。这一个更复杂,因为我需要检查开始日期是否已更改,如果是,则在更改状态之前检查并更新日期
-激活的控制器操作是一个有限的更新操作(使用自定义参数require进行过滤),它将执行以下操作:

if @contrat.update_attributes
  @contrat.activate!
end
我真的不喜欢这些。状态机文章,不管是不是rails,都不要提到事件的参数,还有其他一些模式我应该注意吗


我是否遗漏了一些明显的东西?

这不是实现状态机的方式, 您应该使用创建模型,状态字段指示记录的状态,然后确定对象的状态并使用转换:

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

state\u机器:状态,初始::已启动
...
结束

如果希望创建转换,请执行以下操作:

事件:开始执行
转换[:已创建]=>:已开始
结束

在过渡期间做工作:

在转换之后[:创建]=>:开始,执行::发送邮件

请在此处阅读更多信息: