如何从rails中的控制器调用rake任务

时间:2016-07-07 04:31:51

标签: ruby-on-rails rake

我在/lib/tasks/scriping.rake

中执行了此任务
namespace :scriping do
    task :list => :environment do
        client = CloudscrapeClient.new
        Robot.all.each do |robot|
            execution_id = client.runs(robot.list_run_id).execute(connect: true)
        end
    end

我在控制器中试过这段代码。但它没有用。

Tasks::scriping.execute

在控制台中运行此命令时,它可以正常工作!

bundle exec rake scriping:list

如何从控制器

调用任务:列表此任务

1 个答案:

答案 0 :(得分:3)

最佳解决方案是将共享代码移动到类中!

# app/services/cloud_scrape_client_runner.rb
class CloudScrapeClientRunner
  def self.perform
    client = CloudscrapeClient.new

    Robot.all.each do |robot|
      execution_id = client.runs(robot.list_run_id).execute(connect: true)
    end
  end
end

然后确保您正在加载该文件夹

# in config/application.rb:

config.autoload_paths << Rails.root.join('services')

然后在你的佣金任务中:

namespace :scriping do
  task :list => :environment do
    CloudScrapeClientRunner.perform
  end
end

并在您的控制器中:

class FooController < ApplicationController

  def index
    CloudScrapeClientRunner.perform
  end

end

WHY!?!

因为我猜测CloudScrapeClientSomething是懒惰的,你想要异步地做。

你想要什么:点击链接,让它触发控制器启动任务。

您不想要的内容:点击该链接,让整个应用程序冻结,直到任务完成。