2014-03-14 70 views
1

我有一個Rails 3應用程序,它定義了一些非ActiveRecord模型。所有這些都在app/models/module_name中定義。我在all_autoload_paths如下:Rails加載非ActiveRecord模型

[4] pry(main)> app._all_autoload_paths 
=> ["/Users/mandar/myapp/lib", 
"/Users/mandar/myapp/app/assets", 
"/Users/mandar/myapp/app/controllers", 
"/Users/mandar/myapp/app/helpers", 
"/Users/mandar/myapp/app/models"] 

有間如何加載模型時,以下2類定義的處理方式有區別嗎?

module A 
    class X 
     # some code 
    end 
end 

class A::Y 
    # some code 
end 

我之所以問這個是有時候我見過一個uninitialized constant A::Y - NameError錯誤。

更新:繼Sibevin的回答之後,我想說明一下。目前,我有以下文件結構:

app 
    - models 
    - a 
     - x.rb 
     - y.rb 

我已經看到它使用ModuleName::ClassName語法Y的錯誤,但幾乎從不爲X.

感謝您的幫助!

回答

1

他們應該沒什麼區別,但我通常將它們分成單獨的文件。

您可以先創建一個文件夾app/models/a/,然後將class A::X放入app/models/a/x.rb

類似地,app/models/a/y.rbclass A::Y

順便說一句,app/models/a.rb爲您的module A如果需要。

UPDATE:

其實,我從來沒有使用第2格式的模塊中聲明一個類。也許下面的文檔可以回答你的問題:

Everything you ever wanted to know about constant lookup in Ruby

如果你曾經試圖採取時重新打開一個模塊一個捷徑,你 可能已經注意到,從跳過的命名空間常量AREN 't 可用。這是因爲外部名稱空間未添加到 Module.nesting。

+0

這就是我目前的文件結構。對不起,不準確。我會相應地更新問題。 –

相關問題