我正在构建一个 Ruby on Rails 应用程序,我希望能够编写自定义插件来响应应用程序范围的事件。
例如,用户可以签到我的应用程序中的某个地方。发生这种情况时,我可能希望能够
- 发送电子邮件通知
- 发送推送通知
- 给用户一些积分
- 将事件记录到数据库
关键是,我希望将上述操作与签入代码分离。我希望能够启用或禁用这些不同的代码片段。我应该能够在不接触签入代码库的情况下向代码中添加其他操作。
Ruby on Rails 有什么机制可以做这样的事情吗?
谢谢!
我正在构建一个 Ruby on Rails 应用程序,我希望能够编写自定义插件来响应应用程序范围的事件。
例如,用户可以签到我的应用程序中的某个地方。发生这种情况时,我可能希望能够
关键是,我希望将上述操作与签入代码分离。我希望能够启用或禁用这些不同的代码片段。我应该能够在不接触签入代码库的情况下向代码中添加其他操作。
Ruby on Rails 有什么机制可以做这样的事情吗?
谢谢!
您所描述的本质上是一种通用的发布/订阅机制。有上千种方法可以做到这一点,而且在 github 和 rubygems 上可能有尽可能多的库可用。
他们的关键问题是,你想如何改变行为?您是否乐意在启动时调用一些函数来定义行为?在 ruby 中,这非常简单:
#! /usr/bin/ruby
@hooks = []
def run_hooks(*args)
@hooks.each { |hook| hook.call(*args) }
end
def on_trigger(&hook)
@hooks << hook
end
on_trigger { |*args| puts "This is one trigger: #{args.inspect}" }
on_trigger { puts "This is another trigger" }
run_hooks("some","params")
或者你想要更复杂的东西?
虽然我确信还有很多其他发布/订阅类型的系统,但至少值得看看ActiveSupport::Notifications,它是 rails 的一部分
它使向订阅者发布事件和感兴趣的第 3 方订阅它们变得非常容易。应用程序日志文件中的运行时摘要是这样实现的:rails 使用运行时信息发布事件,并提供将信息写入日志文件的订阅者。这也是 activerecord 查询日志的实现方式。