Rails:运行时的自定义回调?

时间:2014-04-21 13:04:50

标签: ruby-on-rails model

我想知道是否可以在运行时使用自定义回调代码在Rails中赋予模型?

我有一种情况,我有很多“节点”正在创建“事件”,每个节点可能需要在事件上运行特定的回调。例如,一个节点可能需要在创建事件之前调用第三方API以获取额外数据。另一个节点可能需要在创建事件后向其所有者发送电子邮件。

在我的脑海中,当我做“POST / node / 4 / event”时,设置这样的东西是有道理的:

class Nodes::EventsController < ApplicationController
  def create

    # ...security checks in place and we have a @node

    if @node.requires_custom_callbacks?
      # Load the file with callbacks for @node.id,
      # something like Node4EventExtensions
      # Apply Node4EventExtensions to the Event model
    end

    Event.create 

  end
end

这会将特定于节点的代码保留在我的事件模型之外,并允许我单独构建/测试自定义节点扩展。这是否可以在Rails中实现?还有其他方法我应该看看这个吗?

1 个答案:

答案 0 :(得分:0)

我已经用这种方式解决了这个问题,而且它似乎正在坚持,至少对于我最初的自定义要求而言。这是一个关于它如何连接的简化版本:

我的控制器在Event:

上调用一个类方法
class Nodes::EventsController < ApplicationController
  def create

    # ...security checks in place and we have a @node

    if @node.requires_custom_callbacks?
        Event.extend_for_node(node.id)
    end
    Event.create 
  end
end

事件模型然后包括该节点的模块:

class Event < ActiveRecord::Base

  def self.extend_for_node(node_id)
    include "#Node{node_id}Event".constantize
  end

  ...

end

该模块将包含额外要求:

module Node20Event extend ActiveSupport::Concern

  included do
    before_create :im_here
  end

  def im_here
    throw "HERE"
  end

end