我在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任务中执行控制器中已定义的函数
1条答案
按热度按时间ni65a41a1#
你不知道。
控制器的唯一公共方法应该是Rails路由器在响应HTTP请求时调用的“操作”。
Controller是Rack应用程序,对传入的HTTP请求具有硬依赖性-它们不能像Rake任务那样在上下文之外工作,并且将您的Controller用作垃圾抽屉会导致“Fat Controller”反模式。
控制器已经有了大量的责任--他们基本上是通过将用户输入传递给模型,将模型传递给视图来将整个应用程序缝合在一起。
这是一个很容易避免的问题,只需将API调用移到它们自己的类中即可。设计这一点的一种方法是通过客户端类,客户端类只负责与API通信:
这使您可以简单地重用控制器和rake任务之间的代码,并隔离接触应用程序边界的代码,从而避免在应用程序和外部协作者之间创建紧密耦合。
当您将HTTParty用于面向对象而不是过程代码时,它也会非常出色。