コントローラーでrakeタスクを実行したいのですが。これを行う方法はありますか?
私は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を要求できます。
コードでrakeタスクを呼び出すのは良いスタイルではありません。実行するタスクのコードをrakeタスクの外部に配置し、rakeタスクにこのコードを呼び出させることをお勧めします。
これには、外部のrakeを簡単に呼び出すことができるという利点があるだけでなく(これが目的です)、rakeタスクのテストがはるかに簡単になります。
コントローラでこれを行うことができます:
%x[rake name_task]
with:name_task
はタスクの名前です
コントローラで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を呼び出す場合) )コントローラーからそのようなことをしないことを強くお勧めします。