web-dev-qa-db-ja.com

コントローラーでrakeタスクを実行する

コントローラーでrakeタスクを実行したいのですが。これを行う方法はありますか?

70
user143482

私は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を要求できます。

60
Grimmo

コードでrakeタスクを呼び出すのは良いスタイルではありません。実行するタスクのコードをrakeタスクの外部に配置し、rakeタスクにこのコードを呼び出させることをお勧めします。

これには、外部のrakeを簡単に呼び出すことができるという利点があるだけでなく(これが目的です)、rakeタスクのテストがはるかに簡単になります。

56
Denis Defreyne

コントローラでこれを行うことができます:

%x[rake name_task]

with:name_taskはタスクの名前です

16
olibouli

コントローラで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
Jarrod Spillers