2012-06-29 12 views
5

アプリケーションに含まれる宝石のコードで、アプリケーションのRailsファイルシステムルートを知ることは可能ですか?宝石のRailsアプリケーションのルートディレクトリを取得するには

これは、宝石の元のサンプルです:

module MyGem 
    def self.included(base) 
    puts Rails.root # return nil 
    end 
end 

ActionController::Base.send :include, MyGem 

は感謝のともちろん英語

+0

チャットはここではお勧めできません。投稿に「感謝」を追加する場合は(「やめてはいけない」)、「ありがとう」と入力してください。 – meagar

+0

私はルビーの宝石をあまり使っていませんが、 '' '' root_path'''はうまくいきませんか? –

+0

ファイルシステムのルートディレクトリですか?またはURL root_path? –

答えて

7

これと同様の問題を解決するために見つけた解決策は、私のモジュールをレールティッカー初期化子を使用して含めることです。

だから、あなたの/lib/mygem/railtie.rbこのコードで

module MyGem 
    class Railtie < Rails::Railtie 
    initializer "Include your code in the controller" do 
     ActiveSupport.on_load(:action_controller) do 
     include MyGem 
     end 
    end 
end 

で、ActionControllerがロードされた後、あなたのモジュールが含まれます、あなたがRails.root

を使用することができます

これがうまくいくかどうか教えてください。

+0

それは動作するようです。どうもありがとう! – sailor

2

私の貧しい人々のため申し訳ありません:

Rails.root 

あなたが宝石のdoesnを書いているからといってグローバルな名前空間にアクセスできないということです。あなたのGemが、初期化中にRailsモジュールが設定される前にそのアクセス権を使用するのであれば、唯一の懸念事項です。問題が見つかった場合は、使用しているコードを投稿してください。このコードは問題のデバッグに役立ちます。

+0

この場合、Rails.rootはnilを返します。 – sailor

+0

それは起こるべきではありません。より多分、コンテキストはおそらく - 完全なRailsアプリケーションで実行している質問に追加したサンプルか、RSpecなどでテストしていますか?初期化プロセスで#send:include? –

+0

完全なRailsアプリケーションで動作しています。インクルードは、宝石が含まれているときに呼び出されます。コードは基本的に同じです... – sailor

関連する問題