Ruby on rails Rails将具有相似逻辑的两个服务更改为一个服务
在我的Rails6/Grape API应用程序中,我的控制器开始显得有点笨重-逻辑太多,因此我将webhook分布数据包装为两个服务Ruby on rails Rails将具有相似逻辑的两个服务更改为一个服务,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的Rails6/Grape API应用程序中,我的控制器开始显得有点笨重-逻辑太多,因此我将webhook分布数据包装为两个服务Activities::WebhookData和Travels::WebhookData,如下所示: 端点 post do name = CmsClient.fetch_model_name(model_id) #some other logic name == 'Journey' ? ::Journeys::WebhookData.new(par
Activities::WebhookData
和Travels::WebhookData
,如下所示:
端点
post do
name = CmsClient.fetch_model_name(model_id)
#some other logic
name == 'Journey' ? ::Journeys::WebhookData.new(params).call : ::Activities::WebhookData.new(params).call
end
旅程::WebhookData
module Journeys
class WebhookData
def initialize(webhook)
@webhook = webhook
end
attr_accessor :webhook
def call
case webhook[:event_type]
when 'publish'
JourneyWorker.perform_async(webhook)
when 'delete'
HideJourneyWorker.perform_async(webhook)
end
end
end
end
module Activities
class WebhookData
def initialize(webhook)
@webhook = webhook
end
attr_accessor :webhook
def call
case webhook[:event_type]
when 'publish'
ActivityWorker.perform_async(webhook)
when 'delete'
DeleteActivityWorker.perform_async(webhook)
end
end
end
end
活动::WebhookData
module Journeys
class WebhookData
def initialize(webhook)
@webhook = webhook
end
attr_accessor :webhook
def call
case webhook[:event_type]
when 'publish'
JourneyWorker.perform_async(webhook)
when 'delete'
HideJourneyWorker.perform_async(webhook)
end
end
end
end
module Activities
class WebhookData
def initialize(webhook)
@webhook = webhook
end
attr_accessor :webhook
def call
case webhook[:event_type]
when 'publish'
ActivityWorker.perform_async(webhook)
when 'delete'
DeleteActivityWorker.perform_async(webhook)
end
end
end
end
正如您看到的,这两个类几乎相同,有没有更好的方法将这两个服务合并为一个呢?我不建议您将其移动到单个类,因为这两个类都有不同的方法来解释它们接收的webhook数据。如果你这样做了,你将用一些If/else条件来代替它 您可以创建一个类,在该类中定义call方法,从attr\u reader中给定的
事件类型
的散列中获取值,然后创建从第一个类继承的另外两个类,并使用要在其中调用perform\u async
的相应类定义自己的散列:
class Webhook
def call
event_types[webhook[:event_type]].public_send(:perform_async, webhook)
end
protected
def initialize(webhook)
@webhook = webhook
end
private
attr_reader :webhook
def event_types
raise NotImplementedError
end
end
module Journeys
class WebhookData < Webhook
def event_types
{ 'publish' => JourneyWorker, 'delete' => HideJourneyWorker }
end
end
end
module Activities
class WebhookData < Webhook
def event_types
{ 'publish' => ActivityWorker, 'delete' => DeleteActivityWorker }
end
end
end
类Webhook
def呼叫
事件类型[webhook[:事件类型]]。公共发送(:执行异步,webhook)
结束
受保护的
def初始化(webhook)
@webhook=webhook
结束
私有的
属性阅读器:webhook
def事件类型
引发未实现的错误
结束
结束
模块行程
类WebhookDataJourneyWorker,'delete'=>HideJourneyWorker}
结束
结束
结束
模块活动
类WebhookDataActivityWorker'delete'=>DeleteActivityWorker}
结束
结束
结束
我认为您有一个剪切粘贴错误,因为它们是完全相同的类。@rmlockerd很好!问题更新您应该使用函数创建一个模块,然后使用includes来使用它们。@KamalPanhwar与当前方法有什么区别?为什么initialize
方法受到保护?因为您不需要初始化Webhook,而需要初始化它继承的类。