2012-06-30 66 views
1

我試圖將我的Rails項目的一部分抽取到我的lib目錄中,但我無法解決如何正確鏈接文件。我的目錄結構是這樣的:在lib目錄中組織文件

lib/ 
    eventable/ 
    calendar.rb 
    helpers.rb 
# Rest of rails directories/files 

我需要eventable目錄config/application.rb

config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/eventable) 

我的助手和日曆RB文件:

# helpers.rb 
module Eventable 
    module Helpers 
    def calendar_for... 
     Calendar.new... 
    end 
    end 
end 

# calendar.rb 
module Eventable 
    class Calendar 
    # methods defined here 
    end 
end 

我再混合我的常規Rails幫助器中的Eventable :: Helpers模塊,以便我可以在我的視圖中使用calendar_for

ActionView::Base.send :include, Eventable::Helpers 

這最後一步似乎工作正常。然而,當我去到一個視圖這是使用這個幫手,我得到:

uninitialized constant Eventable::Helpers::Calendar 

如果我改變我的助手,以便它試圖訪問Eventable::Calendar.new代替然後我得到:

uninitialized constant Eventable::Calendar 

當我有所有這些都放在一個文件中,這一切都很完美。那麼我怎麼才能正確地鏈接這些文件呢?

回答

1

我有一個類似的問題。我通過改變模塊所需的方式來解決它。

application.rb中

config.autoload_paths += Dir["#{config.root}/lib/"] 

用下面的代碼創建/lib/eventable.rb

require "eventable/helpers" 
require "eventable/calendar" 
+0

感謝此工作。你知道爲什麼這是必要的嗎?是否因爲自動加載無法以正確的順序加載它們?或者因爲我從視圖幫助程序使用Calendar類的事實不足以告訴Rails該類需要自動加載(即,它到達那裏時,它爲時已晚?) –

+0

我不認爲它與訂單或傭工有關。問題來自Ruby。模塊的位置應該與目錄結構相匹配,但是當它們直接從子目錄中需要時,它會引發錯誤。看看這個:[Ruby需要的最佳實踐](http://devblog.vworkapp.com/post/910714976/best-practice-for-rubys-require)。 –

3

它看起來像你需要一個加載器類型的文件來告訴Rails在哪裏找到Eventable模塊的代碼。

嘗試添加lib/eventable.rb有:

module Eventable 
    autoload :Calendar, 'eventable/calendar' 
    autoload :Helpers, 'eventable/helpers' 
end 

你不應該需要,如果你有在地方加載程序文件來改變你的負載路徑。

+0

謝謝,我已經嘗試創建一個文件,但我得到以下錯誤:'無法加載這樣的文件 - 事件/日曆'。有任何想法嗎? –

+0

你使用的是什麼版本的Ruby?需要嘗試的幾件事情是將'.rb'添加到自動加載中,或者將lib/eventable路徑加載到加載路徑之外。通過在你的加載路徑中加入lib目錄,它應該選擇eventable.rb加載器。 –

+0

我使用紅寶石1.9.3p125,並試圖從我的加載路徑(即現在只是lib目錄)中刪除事件的目錄,並嘗試'.rb',但都給我同樣的錯誤。 Wawa的回答雖然適合我。謝謝你的幫助! –