如何在Rails的Rake任务中调用控制器中定义的函数?
问题背景
我在Rails控制器中定义了一个API函数,还有通过scaffold创建的数据库相关函数:
def function @results = HTTParty.get( $baseurl + "/extention", :headers => { $apikey => $apivalue, "Content-Type" => "application/json" }) render json: @results.body end
我定义了一个由clockwork执行的Rake任务,目前在开发环境中只能通过HTTParty进行内部调用并处理返回的哈希:
def rake_function @results = HTTParty.get("http://localhost:3000/controller/extension/") return @results.parsed_response end
此外,任务执行完成后需进行POST和PUT请求,我也必须通过HTTParty实现:
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. 抽离控制器核心逻辑到服务类
控制器应专注处理请求与响应,把核心业务逻辑抽离到独立服务类,方便多处复用。创建服务类文件:
# app/services/external_api_service.rb class ExternalApiService def self.fetch_extension_data response = HTTParty.get("#{$baseurl}/extention", headers: { $apikey => $apivalue, "Content-Type" => "application/json" }) response.parsed_response end end
修改控制器的function方法,调用服务类逻辑:
def function data = ExternalApiService.fetch_extension_data render json: data end
2. 在Rake任务中直接调用服务类
无需再通过HTTP请求调用接口,直接调用服务类方法获取数据:
def rake_function @results = ExternalApiService.fetch_extension_data return @results end
3. 复用模型的CRUD逻辑处理POST/PUT
scaffold生成的模型自带CRUD方法,直接用模型操作替代HTTP请求。假设对应模型为Extension,修改代码如下:
# 替换原有的HTTParty POST/PUT逻辑 if !Extension.exists?(date_time: yesterday) @response = Extension.create(eodData) else check_record = Extension.find_by(date_time: yesterday) @response = check_record.update(eodData) end
注:可根据实际模型名称调整代码,Extension.exists?可以直接替代原有的datExist判断,更符合Rails规范
4. 确保Rake任务加载Rails环境
在Rake任务顶部添加:environment依赖,这样才能访问Rails的模型和服务类:
namespace :your_task_namespace do task :run_extension_task => :environment do # 任务逻辑:调用服务类获取数据,执行模型CRUD操作 end end
内容的提问来源于stack exchange,提问作者dprieto
相关产品推荐
相关产品推荐

