2009-07-23 4 views
63

私のコントローラーでレーキタスクを実行したいと思います。これを行う方法はありますか?コントローラーでレーキタスクを実行する

+1

http://railscasts.com/episodes/127-rake-in-background – baash05

+5

これを試す>>システム "rake task_name" ' – Bongs

+0

Ryan Batesは[いくつかの方法をカバーしています](http://railscasts.com/episodes/127-rake-in-background)をRailsCast Episode#127に追加しました。 –

答えて

49

コードでレーキタスクを呼び出すのに良いスタイルが見つかりません。レーキタスクの外で実行したいタスクのコードを入れ、レーキタスクがこのコードを呼び出すようにすることをお勧めします。

これは、外部のレーキ(あなたが望むもの)を呼び出すのが簡単であるだけでなく、レーキのタスクをテストするのがずっと簡単です。

+6

+1私は同意する:これはリファクタリングされ、2つの異なる方法で呼び出されるべき事柄の完全な例である。 –

+7

http://railscasts.com/episodes/127-rake-in-backgroundレイクを走らせるすばらしい理由があると思われます。 – baash05

+4

"どこかで"良い "どこか"が "レイクタスクの外のどこ"になるのでしょうか? – user456584

16

あなたのコントローラでこれを行うことができますと

%x[rake name_task] 

name_task

+2

どのように環境に渡しますか? – serengeti12

+3

私は生産中の私のコントローラーからのレーキに決して出てこないでしょう。 – Duke

+14

@Dukeあなたが答えるかコメントしたときに、推論を説明するだけでなく、アサーションを作成することもできます(プロダクションのコントローラはレーキタスクを呼び出すべきではありません)。これは、あなたが何をしないのかを知るだけではなく、あなたの推論を理解するのに役立ちます(理由についてあなたの説明を聞いていません)。 – Matt

55

は私が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をイニシャライザで使用することができます。

+0

「アプリケーション名」はどこですか? – pdxleif

+0

@pxdleif Railsを使用していると仮定すると、モジュール名として 'config/application.rb'に12行ほど下がっています。 –

+1

あなたは 'Rails.application'を呼び出してアプリケーションを参照することもできます – declan

8

コントローラで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)のいくつかを呼び出そうとしているなら、コントローラからそのようなことをしないことを強くお勧めします。

+0

これは非常にクリーンな方法です。ありがとう。 – juliangonzalez