我想知道是否可以在运行时使用自定义回调代码在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中实现?还有其他方法我应该看看这个吗?
答案 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