如何在 AASM 中为任何 "event" 进行通用回调
How to make a generic callback for any "event" in AASM
我有一个状态机,在 Rails 应用程序(使用 ActiveRecord)中,用 AASM 定义,它有很多回调。其中一些回调包含重复代码。例如,在每次状态更改时,我们需要建立并保存一条记录并发送一封邮件。
event :revision, after: :revision_event_callback do
# ...
end
event :basic_submit, after: :basic_submit_event_callback do
# ...
end
event :approve, after: :approve_event_callback do
# ...
end
def revision_event_callback
OrderStatusMailer.status_change_report(self, :revision)
state_changes.build(transition: :revision)
end
def basic_submit_event_callback
OrderStatusMailer.status_change_report(self, :basic_submit)
state_changes.build(transition: :basic_submit)
# ...
# basic_submit-specific events
end
def approve_event_callback
OrderStatusMailer.status_change_report(self, :approve)
state_changes.build(transition: :approve)
end
相反,我想要一个通用回调,并且,对于那些
需要,具体另加。
def event_callback(event_name)
OrderStatusMailer.status_change_report(self, event_name)
state_changes.build(transition: event_name)
end
def basic_submit_event_callback
# basic_submit-specific events
end
这可能吗?而且,非常重要:该代码将如何
访问触发事件的名称?
有可能。你可以——在任何像 :after 这样的回调中——请求被触发的当前事件,像这样:
def event_callback
event_name = aasm.current_event # e.g. :revision or :revision!
OrderStatusMailer.status_change_report(self, event_name)
state_changes.build(transition: event_name)
end
这样做怎么样。
after_all_events : event_callback
然后定义一个方法
def event_callback(*args)
# do stuff here
after_callback = "after_#{current_event}"
send(callback, *args) if respond_to?(callback)
end
我有一个状态机,在 Rails 应用程序(使用 ActiveRecord)中,用 AASM 定义,它有很多回调。其中一些回调包含重复代码。例如,在每次状态更改时,我们需要建立并保存一条记录并发送一封邮件。
event :revision, after: :revision_event_callback do
# ...
end
event :basic_submit, after: :basic_submit_event_callback do
# ...
end
event :approve, after: :approve_event_callback do
# ...
end
def revision_event_callback
OrderStatusMailer.status_change_report(self, :revision)
state_changes.build(transition: :revision)
end
def basic_submit_event_callback
OrderStatusMailer.status_change_report(self, :basic_submit)
state_changes.build(transition: :basic_submit)
# ...
# basic_submit-specific events
end
def approve_event_callback
OrderStatusMailer.status_change_report(self, :approve)
state_changes.build(transition: :approve)
end
相反,我想要一个通用回调,并且,对于那些 需要,具体另加。
def event_callback(event_name)
OrderStatusMailer.status_change_report(self, event_name)
state_changes.build(transition: event_name)
end
def basic_submit_event_callback
# basic_submit-specific events
end
这可能吗?而且,非常重要:该代码将如何 访问触发事件的名称?
有可能。你可以——在任何像 :after 这样的回调中——请求被触发的当前事件,像这样:
def event_callback
event_name = aasm.current_event # e.g. :revision or :revision!
OrderStatusMailer.status_change_report(self, event_name)
state_changes.build(transition: event_name)
end
这样做怎么样。
after_all_events : event_callback
然后定义一个方法
def event_callback(*args)
# do stuff here
after_callback = "after_#{current_event}"
send(callback, *args) if respond_to?(callback)
end