2012-06-29 72 views
5

是否有可能在應用程序中包含的gem代碼中瞭解應用程序的Rails文件系統根目錄?如何在Gem中獲取Rails應用程序的根目錄

這是寶石源的樣本:

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

ActionController::Base.send :include, MyGem 

感謝的和對不起我的英文不好

+0

聊天說話不鼓勵在這裏。如果您要爲帖子添加「謝謝」(您不應該這麼做),請鍵入「謝謝」,而不是「thx」。 – meagar

+0

我還沒有做過多與紅寶石寶石,但我想知道'''root_path'''不工作? –

+0

文件系統根目錄?或URL root_path? –

回答

7

我發現解決類似問題的解決方案是使用railtie初始化器包含我的模塊。

所以,在你/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 

僅僅因爲你正在編寫一個寶石沒有按這意味着你不能訪問全局名稱空間。唯一的問題是,如果你的Gem在初始化期間設置Rails模塊之前使用了這個訪問。如果您發現問題所在,請將您使用的代碼發佈到哪裏,我們很樂意幫助您解決問題。

+0

Rails.root在這種情況下返回nil。 – sailor

+0

這不應該發生。更多的上下文也許 - 是你添加到完整的Rails應用程序中運行的問題的示例,還是你使用RSpec或類似的測試?在初始化過程中,您是否在調用#send:include? –

+0

它運行在一個完整的Rails應用程序中。當包含gem被調用時,代碼基本上是相同的...... – sailor

相關問題