2014-04-21 39 views
0

我想知道是否有可能在運行時使用自定義回調代碼在Rails中賦予模型?Rails:運行時自定義回調?

我有一個情況,我有很多「節點」正在創建「事件」,並且每個節點可能需要在事件上運行特定的回調。例如,一個節點在創建事件之前可能需要向第三方API發出額外數據。創建事件後,另一個節點可能需要向其所有者發送電子郵件。

在我的頭上,這是有道理設立這樣的事情時,我做了一個「POST /節點/ 4 /事件」:

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中脫穎而出?我還有另外一種方式來看待這個嗎?

+0

你想描述一個工作流引擎嗎? –

+0

我不得不查找工作流引擎。我不認爲這正是我正在尋找的。我的一些節點在發佈活動時有特定的自定義要求。 Node20可能需要一個before_create回調來ping第三方API以獲得許可,而Node22可能需要after_create才能在成功時發送電子郵件。 我的想法是,我可以創建類似「Node20Event」模塊的東西,並將其動態地包含到Event中,以便Event在請求期間的行爲與Node20Event類似。我還沒有找到辦法解決這個問題。 –

+0

那麼你可能需要創建你的模型的子類。 –

回答

0

我已經完成了這種方式,它似乎在等待我的初始自定義要求。下面是它是如何連接的一個精簡版:

我的控制器調用事件類方法:然後

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