在控制器中运行 rake 任务

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

48312 次浏览

我不认为用代码调用 rake 任务是一种好的方式。我建议将要执行的任务的代码放在 rake 任务之外,并让 rake 任务调用这段代码。

这不仅具有容易调用外部 rake (这是您想要的)的优点,而且还使得测试 rake 任务更加容易。

您可以在您的控制器中完成以下操作:

%x[rake name_task]

With: name_task是任务的名称

我同意 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 _ task。

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

class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end

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

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

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