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
- 我在 before_save 方法中执行此操作,该方法将由更新触发。这个比较复杂,因为我需要检查 start_date 是否已更改,如果是,我会在更改状态之前检查日期并更新它。
-用于激活的控制器操作是一个有限的更新操作(使用自定义参数要求过滤),它将执行类似的操作:
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
在此处阅读更多内容:
我正在使用 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
- 我在 before_save 方法中执行此操作,该方法将由更新触发。这个比较复杂,因为我需要检查 start_date 是否已更改,如果是,我会在更改状态之前检查日期并更新它。
-用于激活的控制器操作是一个有限的更新操作(使用自定义参数要求过滤),它将执行类似的操作:
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
在此处阅读更多内容: