Ruby on rails Rails将具有相似逻辑的两个服务更改为一个服务

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

在我的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(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,而需要初始化它继承的类。