ruby 如何在rake任务中使用rails中的controller中定义的函数?

l7wslrjt  于 2022-11-29  发布在  Ruby
关注(0)|答案(1)|浏览(153)

我在Rails控制器中定义了一个API函数,在我使用scaffold创建的数据库中定义了另一个API函数。

def function
    @results = HTTParty.get( $baseurl + "/extention", :headers => {
      $apikey => $apivalue,
      "Content-Type" => "application/json"
    })
    render json: @results.body
  end

`
我已经定义了一个rake任务,它是用时钟机制执行的,但是为了使它在当前的开发环境中工作,我不得不使用httpparty在内部调用它,并处理接收到的哈希值。

def rake_function
    @results = HTTParty.get("http://localhost:3000/controller/extension/")
    return @results.parsed_response
  end

In addition, my task makes a post and a put when the execution is finished and I must also use a httparty for that.

if (!datExist)
        @response = HTTParty.post("http://localhost:3000/controller/extension/",
        body: eodData
        )
    else (datExist)
        checkId = dbData.select {|x| x["date_time"] == yesterday}
        id = checkId[0]["id"].to_s
        @response = HTTParty.put("http://localhost:3000/controller/extension/" + id,
        body: eodData
        )
    end

`
我知道这不是最佳方式,所以我希望能够在rake任务中执行控制器中已定义的函数

ni65a41a

ni65a41a1#

你不知道。
控制器的唯一公共方法应该是Rails路由器在响应HTTP请求时调用的“操作”。
Controller是Rack应用程序,对传入的HTTP请求具有硬依赖性-它们不能像Rake任务那样在上下文之外工作,并且将您的Controller用作垃圾抽屉会导致“Fat Controller”反模式。
控制器已经有了大量的责任--他们基本上是通过将用户输入传递给模型,将模型传递给视图来将整个应用程序缝合在一起。
这是一个很容易避免的问题,只需将API调用移到它们自己的类中即可。设计这一点的一种方法是通过客户端类,客户端类只负责与API通信:

class MyApiClient
  include HTTParty
  format :json
  base_url $baseurl # Code smell - avoid the use of globals
  attr_reader :api_key, :api_value

  def initalize(api_key:, api_value:)
    @api_key = api_key
    @api_value = api_value
  end

  def get_extension
    # I don't get why you think you need to dynamically set the header key
    self.class.get('extension', headers: { api_key => api_value })
  end
end

这使您可以简单地重用控制器和rake任务之间的代码,并隔离接触应用程序边界的代码,从而避免在应用程序和外部协作者之间创建紧密耦合。
当您将HTTParty用于面向对象而不是过程代码时,它也会非常出色。

相关问题