0

我有一个状态机,在 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

Intead,我想要一个通用回调,并且对于需要它的事件,还有一个特定的回调。

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

这可能吗?而且,非常重要的是:该代码如何访问被触发事件的名称?

4

2 回答 2

2

这样做怎么样。

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
于 2016-10-07T07:27:05.327 回答
0

这是可能的。你可以——在任何回调中,比如 :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
于 2015-03-31T08:35:22.537 回答