我想在我的控制器中运行rake任务。有没有办法做到这一点?
答案 0 :(得分:59)
我同意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。
答案 1 :(得分:56)
我觉得在代码中调用rake任务并不好。我建议在rake任务之外的某处执行要执行的任务的代码,并让rake任务调用此代码。
这不仅具有易于调用外部rake(这是你想要的)的优点,而且还可以更轻松地测试rake任务。
答案 2 :(得分:15)
您可以在控制器中执行此操作:
%x[rake name_task]
with:name_task
是您的任务名称
答案 3 :(得分:12)
不是试图在控制器中调用rake任务,而是调用包含您尝试执行的逻辑的服务对象。
&#xA;&#xA; class SomeController&lt ; ApplicationController中&#XA;什么&#xA; SomeServiceObject.call&#XA;结束&#xA;结束&#xA;
&#xA;&#xA; ...然后,假设您正在谈论自定义rake任务,请将服务对象称为好吧:
&#xA;&#xA; 命名空间:示例做&#xA; desc'重要任务'&#xA;任务:important_task do&#xA; SomeServiceObject.call&#XA;结束&#xA;结束&#xA;
&#xA;&#xA; 如果您不熟悉服务对象,它们只是执行特定工作的普通旧ruby类。如果你试图调用一些默认的rake任务(即:db:migrate),我强烈建议不要从控制器那里做那种事情。
&#xA;