2009-09-20 11 views

答えて

61

はい、可能です。ヘルパーファイルを必要とするだけで、そのヘルパーをあなたのレーキファイルの中に入れるだけです(実際にヘルパーは私たちが含めることができるmixinです)。

例えば、ここで私はアプリ/ヘルパー内部application_helperファイルこれが含まれているディレクトリていますので、ここで

module ApplicationHelper 
    def hi 
    "hi" 
    end 
end 

は私のすくいファイルの内容です:

require "#{Rails.root}/app/helpers/application_helper" 
include ApplicationHelper 

namespace :help do 
    task :hi do 
    puts hi 
    end 
end 

、ここで私の端末の結果です:

god:helper-in-rake arie$ rake help:hi 
hi 
+3

rake内で 'include'を使用すると、誤って' Object'のスコープが汚染されます。これは、その後にインポートされたすべてのレーキタスクに同じメソッドを共有することになります。 – lfender6445

+1

その後にインポートされたレーキタスクはどういう意味ですか?他の.rakeファイルからのレイクタスクの場合と同様に、ApplicationHelperメソッドにアクセスできますか? –

+0

これは言われていますが、それでも十分だとは言えません。特にRailsアプリ(これはRakeを広範囲に使用しています)では本当に*これはしてはいけません。これはグローバルな 'Object'を使いこなしてしまいます。これは追跡が非常に難しい、広範囲の影響を及ぼします。ちょうどこの2時間を失った... – nrser

10

lfeender6445が記載されているように、Arieの答えのようにinclude ApplicationHelperを使用すると、タスクを含むトップレベルのスコープが汚染されます。

安全でない副作用を避けるための代替方法があります。

最初に、私たちはではなく、app/helpersに作業ヘルパーを入れてください。 codefol.ioで"Where Do I Put My Code?"から引用するには:

Rails "helpers"は非常に具体的にビューヘルパーです。それらは自動的にビューに含まれますが、コントローラやモデルには含まれません。それが目的です。

app/helpersはビューヘルパー向けであり、Rakeタスクはビューではないため、他の場所にタスクヘルパーを配置する必要があります。私はlib/task_helpersをお勧めします。

lib/task_helpers/application_helper.rb

:あなたのRakefile

module ApplicationHelper 
    def self.hi 
    "hi" 
    end 
end 

またはlib/tasks.rakeファイル:

require 'task_helpers/application_helper' 

namespace :help do 
    task :hi do 
    puts ApplicationHelper.hi 
    end 
end 

質問はもともとすくいタスクのビューヘルパーを含めについて尋ねられた場合、私はわからないんだけど、 Rakeタスクのための "ヘルパーメソッド"だけです。しかし、ビューとタスクの両方でヘルパーファイルを共有することは理想的ではありません。代わりに、で使用するヘルパーを、ビューとタスクの両方をとし、それらをビューヘルパーとタスクヘルパーの両方に含まれる別個の依存関係に移動します。

+1

これは私のためにそれを解決しました - あなたがしたようにスコープを並べ替えるまでヘルパーメソッドに引数を渡す場合は、それを行うことができません –

+0

私は疑問に思っていますそれを 'application_helper 'と呼ぶのは良い考えです。それは混乱の原因となる可能性があるためです。たぶん 'lib/task_helpers.rb'だけが良いでしょう。 –

+0

それは良いと安全な方法です...ありがとう.... – prasanthrubyist

関連する問題