私のコントローラーでレーキタスクを実行したいと思います。これを行う方法はありますか?コントローラーでレーキタスクを実行する
答えて
コードでレーキタスクを呼び出すのに良いスタイルが見つかりません。レーキタスクの外で実行したいタスクのコードを入れ、レーキタスクがこのコードを呼び出すようにすることをお勧めします。
これは、外部のレーキ(あなたが望むもの)を呼び出すのが簡単であるだけでなく、レーキのタスクをテストするのがずっと簡単です。
+1私は同意する:これはリファクタリングされ、2つの異なる方法で呼び出されるべき事柄の完全な例である。 –
http://railscasts.com/episodes/127-rake-in-backgroundレイクを走らせるすばらしい理由があると思われます。 – baash05
"どこかで"良い "どこか"が "レイクタスクの外のどこ"になるのでしょうか? – user456584
あなたのコントローラでこれを行うことができますと
%x[rake name_task]
:name_task
は
どのように環境に渡しますか? – serengeti12
私は生産中の私のコントローラーからのレーキに決して出てこないでしょう。 – Duke
@Dukeあなたが答えるかコメントしたときに、推論を説明するだけでなく、アサーションを作成することもできます(プロダクションのコントローラはレーキタスクを呼び出すべきではありません)。これは、あなたが何をしないのかを知るだけではなく、あなたの推論を理解するのに役立ちます(理由についてあなたの説明を聞いていません)。 – Matt
は私が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タスクを呼び出す代わりに、実行しようとしているロジックを含むサービスオブジェクトを呼び出します。
class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end
...そして、それは同様のサービスオブジェクトを呼び出す必要があり、カスタムrakeタスクについて話していると仮定すると:場合
namespace :example do
desc 'important task'
task :important_task do
SomeServiceObject.call
end
end
あなたがサービスオブジェクトに慣れていない、彼らは特定の仕事をする普通の古いルビークラスです。デフォルトのレーキタスク(すなわち:db:migrate)のいくつかを呼び出そうとしているなら、コントローラからそのようなことをしないことを強くお勧めします。
これは非常にクリーンな方法です。ありがとう。 – juliangonzalez
http://railscasts.com/episodes/127-rake-in-background – baash05
これを試す>>システム "rake task_name" ' – Bongs
Ryan Batesは[いくつかの方法をカバーしています](http://railscasts.com/episodes/127-rake-in-background)をRailsCast Episode#127に追加しました。 –