在控制器中运行rake任务

时间:2009-07-23 07:18:46

标签: ruby-on-rails ruby rake

我想在我的控制器中运行rake任务。有没有办法做到这一点?

4 个答案:

答案 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;