代码之家  ›  专栏  ›  技术社区  ›  DollarChills

全局变量/函数

  •  0
  • DollarChills  · 技术社区  · 4 年前

    在rails应用程序中,当代码块跨多个控制器使用时,保持代码块干燥的最佳方法是什么?

    最好创建一个全局变量/函数来处理这个问题,并将它放在我的 application_controller 并通过控制器传递所需变量?

    data = HTTParty.get("https://www.url.com/start=#{@contoller.start_date.strftime('%Y%m%d')}&finish=#{@contoller.end_date.strftime('%Y%m%d')}&format=json")
    @data = JSON.parse(data.body)
      
    rainfall_total = 0
      
    @data['data'].each do |data|
     # This adds up rainfall between above date variables
     rainfall = data['value'][0]
     @total_rain = (rainfall_total += rainfall).round(1)
    end
    

    所以在上面的代码中,我有一个start和end date变量。我有3个控制器(stageOne、StageTo和stageThree),其中输入了不同的开始/结束日期,它将计算每个阶段的总降雨量。在所有三个控制器中不重复相同代码的最佳实践是什么?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Jon    4 年前

    我将为您创建一个服务对象来处理此请求。

    您的控制器不应该负责处理这样的业务逻辑,因此您应该遵从另一个应该有此责任的对象(模型、服务等)。

    This blog post provides some good examples

    创建一个文件 app/services/rainfall_service.rb

    class RainfallService
      def initialize(start_date, end_date)
        @start_date = start_date
        @end_date = end_date
      end
    
      def self.call(*args)
        new(*args).call
      end
    
      def call
        # TODO: implement your code for fetching the data, formatting it, etc
        # return the data you want to use
      end
    end
    

    app/controllers/stage_one_controller.rb

    def show
      @rainfall = RainfallService.call(start_date, end_date)
    end
    

    我猜你的开始/结束日期 params 或者别的什么。