在控制器中运行 rake 任务

问题描述 投票:0回答:4

我想在我的控制器中运行 rake 任务。有什么办法可以做到这一点吗?

ruby-on-rails ruby rake
4个回答
65
投票

我同意 ddfreynee,但如果你知道你需要什么,代码可以是这样的:

require 'rake'

Rake::Task.clear # necessary to avoid tasks being loaded several times in dev mode
Sample::Application.load_tasks # providing your application name is 'sample'

class RakeController < ApplicationController

  def run
    Rake::Task[params[:task]].reenable # in case you're going to invoke the same task second time.
    Rake::Task[params[:task]].invoke
  end

end

您可以在初始化程序中要求“rake”和.load_tasks。


62
投票

我删除了这个答案,以抗议 Stack Overflow 与 OpenAI 的合作关系。我不同意我的写作被用来训练生成式人工智能模型。


25
投票

不要尝试在控制器中调用 rake 任务,而是调用包含您尝试执行的任何逻辑的服务对象。

class SomeController < ApplicationController
  def whatever
    SomeServiceObject.call
  end
end

...然后,假设您正在讨论自定义 rake 任务,让它也调用服务对象:

namespace :example do
  desc 'important task'
  task :important_task do
    SomeServiceObject.call
  end
end

如果您不熟悉服务对象,它们只是执行特定工作的普通旧 ruby 类。如果您尝试调用一些默认的 rake 任务(即:db:migrate),我强烈建议不要从控制器执行此类操作。


14
投票

您可以在控制器中执行此操作:

%x[rake name_task]

with:

name_task
是您的任务名称

© www.soinside.com 2019 - 2024. All rights reserved.