用于插件架构的Rails应用程序范围的事件/钩子

时间:2012-04-04 18:15:25

标签: ruby-on-rails

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

例如,用户可以登记我的应用程序中的某个位置。发生这种情况时,我可能希望能够

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

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

Ruby on Rails是否有任何机制可以做这样的事情?

谢谢!

2 个答案:

答案 0 :(得分:1)

您所描述的内容实质上是一种通用的帖子/订阅机制。有一千种方法可以做到这一点,并且可能有许多库可用于github和rubygems。

他们的关键问题是,您想如何改变行为?您是否乐意在启动时调用某些功能来定义行为?在红宝石中,这很荒谬:

#! /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")

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

答案 1 :(得分:1)

虽然我确信还有很多其他的发布/订阅类型系统,但至少可以看看ActiveSupport::Notifications是否属于rails

通过向订阅者发布活动以及感兴趣的第三方订阅它们非常容易。应用程序日志文件中的运行时摘要是使用以下命令实现的:rails使用运行时信息发布事件,并提供将信息写入日志文件的订阅者。这也是activerecord查询日志记录的实现方式。