2016-03-07 121 views
2

如何告訴Rails(5 beta3)在app/models而不是app/models/namespace中尋找名稱空間模型?如何告訴Rails從頂級目錄自動加載名稱空間模型?

module MyApp 
    class User < ApplicationRecord 
    ... 
    end 
end 

,如果我把它放在app/models/myapp Rails的發現它。但是,因爲我所有的模型都在MyApp模塊中,所以我寧願將它們保留在app/models之內。

感謝

+2

嗨。我相信你知道這一點。但是,看起來你正在與Rails公約打交道。我想知道,只要遵守這些慣例,你是不是更好。不是你的問題的答案(對不起),只是一個想法。 – jvillian

+0

是的,我知道它,如果我必須使用一個額外的文件夾,這將是世界的盡頭,但我想知道是否有一種簡單的方法來保持清潔。 謝謝 – macsig

回答

3

不,你不能在一個目錄中,如自動加載路徑(app/models)頂級告訴Rails尋找一個合格的常數(如MyApp::User)。當Rails看到MyApp::User(代碼不在模塊定義內)時,它只會在自動加載路徑中的目錄中查找my_app/user.rb

您從不使用限定常量可以欺騙Rails很多時間。如果你的控制器都在同一個命名空間,下面將工作:

應用程序/控制器/程序my_app/users_controller.rb

module MyApp 
    class UsersController < ApplicationController 
    def index 
     @users = User.all 
    end 
    end 
end 

應用程序/模型/ user.rb

module MyApp 
    class User < ActiveRecord::Base 
    end 
end 

的Rails沒有按不知道控制器中引用的User是頂層還是MyApp,所以它會查找app/models/user.rbapp/models/my_app/user.rb。同樣,您可以從其他名稱空間模型自動加載名稱空間模型app/models

但是,只要需要從名稱空間中本身不存在的代碼引用名稱空間模型,就會碰壁(也就是說,您必須手動要求模型類文件),例如,在控制檯或單元測試中。如果在子目錄中有控制器,但模型不在子目錄中,那將是愚蠢的。而且你會迷惑任何看着你的代碼的人。所以最好的做法是遵循Rails約定,並將你的命名空間模型放在app/models的子目錄中。

相關問題