2016-10-31 13 views
1

私は周りのフックのような振る舞いを実装したいいくつかのレーキタスクを持っています。具体的には、私は自分のすべてのRakeタスクが特定の(複雑な、派生した)Time.use_zoneブロックで実行されるようにする方法を探しています。類推するためレーキタスクのラウンドフックのような動作をどうやって得ることができますか?

、私は私のApplicationControllerでこれを持っている:

around_filter :use_time_zone 

def use_time_zone 
    time_zone = non_trivial_derivation 
    Time.use_zone(time_zone) { yield } 
end 

そして今、すべての私のコントローラのアクションは、適切に指定された時間帯に実行されます。私はこのようなRakeの仕組みを望んでいる。私は自分のレーキタスクの依存関係を変更したり変更したりしたいと思っていますが、メンテナンスの脆弱性を招く懸念から、実際のタイムゾーンの派生コードを各レーキタスクの先頭に挿入したくありません。 私は、Rakeの依存関係には解決策があると確信しています。 - Rakeの依存関係によって、私のRailsアプリケーションのコンテキストでコードを実行できるようになりました。しかし、私はこのユースケースのためにそれをどうやって行うのか理解できません。

答えて

2

私はそのようなrake-hooksなど任意の外部依存関係や宝石を必要としない簡単な解決策を考え出した:アイデアは、あなたがメインuse_timezoneタスクを実行して、あなたの実際のタスクに渡すことです

desc "rake around hook" 
task :use_timezone, [:subtask] => :environment do |name, args| 
    puts "using timezone" 
    Rake::Task[args[:subtask]].invoke 
    puts "end using timezone" 
end 

task :testing do 
    puts "testing" 
end 

引数:

$ rake use_timezone[testing] 

出力:

> using timezone 
> testing 
> end using timezone 

task :use_timezone, [:subtask] => :environment do |name, args| 
    time_zone = non_trivial_derivation 
    Time.use_zone(time_zone) { Rake::Task[args[:subtask]].invoke } 
end 

そして、このようにそれを使用します:あなたはこのようにそれを書くことができ、あなたのケースでは10

$ rake use_timezone[your_task] 

希望に役立ちます。

関連する問題