代码之家  ›  专栏  ›  技术社区  ›  Topher Fangio

RubyonRails中的触发器/回调

  •  3
  • Topher Fangio  · 技术社区  · 15 年前

    我们正在rubyonrails中创建一个系统,我们希望能够为用户提供一点关于在某些预定义触发器发生时可能发生的通知和操作的控制。此外,我们计划迭代导入的数据,并允许用户基于该数据配置一些操作和触发器。

    让我举几个例子来更好地说明:

    Trigger                              - Action
    ------------------------------------------------------------------------
    New Ticket is Created                - User receives an e-mail
    New Ticket Parsed for Keyword 'evil' - Ticket gets auto-assigned to a
                                           particular group
    User Missed 3 Meetings               - A ticket is automatically created
    

    理想情况下,我们希望一些触发器是可配置的。例如,最后一个示例可能允许您配置在操作发生之前错过了多少次会议。

    任何想法都将不胜感激。谢谢

    看了之后,我注意到SO上的徽章系统有些相似,基于这些标准,我想做这个动作。虽然略有不同,但我希望能够轻松添加新的标准和操作,并将它们呈现给用户。对此有何想法?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Jimmy Stenke    15 年前

    我想你要找的是观察员。 在您的示例中,观察者可以处理第一个和第三个示例(但不能处理第二个示例,因为观察者只观察对象,不与对象交互,即使在技术上是可能的)。

    一些代码来说明我的意思:

    class TicketObserver < ActiveRecord::Observer
      def after_create(ticket)
        UserMailer.deliver_new_ticket_notification
      end
    end
    
    class UserObserver < ActiveRecord::Observer
      def after_update(user)
        Ticket.new if user.recently_missed_a_meeting and user.missed_meetings > 3
      end
    end
    

    然后将观察者添加到environment.rb

    config.active_record.observers = :user_observer, :ticket_observer
    

    由于每次更新用户后都会触发after_更新,因此 recently_missed_a_meeting 属性是有用的。我通常遵循restful身份验证的思想,每次我想触发该行时,都会将一个实例变量设置为true。这可以在回调或某些自定义逻辑中完成,具体取决于您跟踪会议的方式。

    对于第二个例子,我会把它放在 before_update

        2
  •  1
  •   DrewM    15 年前

    您应该看看Rails中的“回调”方法

    有关文档,请参阅- Callbacks

        3
  •  0
  •   Zepplock    15 年前