2

我正在构建一个 Ruby on Rails 应用程序,我希望能够编写自定义插件来响应应用程序范围的事件。

例如,用户可以签到我的应用程序中的某个地方。发生这种情况时,我可能希望能够

  • 发送电子邮件通知
  • 发送推送通知
  • 给用户一些积分
  • 将事件记录到数据库

关键是,我希望将上述操作与签入代码分离。我希望能够启用或禁用这些不同的代码片段。我应该能够在不接触签入代码库的情况下向代码中添加其他操作。

Ruby on Rails 有什么机制可以做这样的事情吗?

谢谢!

4

2 回答 2

1

您所描述的本质上是一种通用的发布/订阅机制。有上千种方法可以做到这一点,而且在 github 和 ruby​​gems 上可能有尽可能多的库可用。

他们的关键问题是,你想如何改变行为?您是否乐意在启动时调用一些函数来定义行为?在 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")

或者你想要更复杂的东西?

于 2012-04-04T19:01:18.093 回答
1

虽然我确信还有很多其他发布/订阅类型的系统,但至少值得看看ActiveSupport::Notifications,它是 rails 的一部分

它使向订阅者发布事件和感兴趣的第 3 方订阅它们变得非常容易。应用程序日志文件中的运行时摘要是这样实现的:rails 使用运行时信息发布事件,并提供将信息写入日志文件的订阅者。这也是 activerecord 查询日志的实现方式。

于 2012-04-04T19:10:15.773 回答