2011-02-11 70 views
1

我把我的頭髮拉出來試圖理解Rails 3中的命名空間。我嘗試了以下幾個不同的教程,並且我可以讓我的模型工作的唯一方法是如果我在基本目錄中定義模型並且我的名字空間目錄。Rails 3命名空間需要模型被定義兩次?

如果我只定義它希望這個定義這兩個型號和命名空間::模型,如下命名目錄的型號:

LoadError (Expected .../app/models/plugins/chat.rb to define Chat): 

LoadError (Expected .../app/models/plugins/chat.rb to define Plugins::Chat): 

我敢肯定,我我錯過了一些明顯的東西,但我真的可以用正確的方向使用指針。 這裏是相關的摘錄。

/models/plugins/chat.rb

class Plugins::Chat 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 
... 
end 

/controllers/plugins/chats_controller.rb

class Plugins::ChatsController < Plugins::ApplicationController 
load_and_authorize_resource 
... 
end 

/config/routes.rb

namespace :plugins do 
    resources :chats 
end 

/配置/ application.rb

config.autoload_paths += Dir["#{config.root}/app/models/**/"] 

編輯 這是某種與慘慘,我們使用的權限寶石不良相互作用。該行load_and_authorize_resource在某種程度上是錯誤的。將繼續挖...

回答

2

我注意到在你的控制器中對load_and_authorize_resource的引用。 CanCan gem使用此方法創建模型的實例,然後測試用戶是否可以訪問它。如果您使用的是名稱空間模式,您需要指定類別:

class Plugins::ChatsController < Plugins::ApplicationController 
load_and_authorize_resource :class "Plugins::Chat" 
... 
end 
+0

這樣做。我還必須使用完整的類路徑來定義我的權限。謝謝。 – RSG 2011-02-11 08:20:52

0

這聽起來像在某些時候你在加載之前引用Chat常量\本身。 Rails然後試圖通過查看models/chat.rb來發現,無法找到它,並抱怨。檢查你的不斷使用情況(回溯應該告訴你它從哪裏被調用),並清理它,Rails應該減少抱怨。

+0

對不起,我有點新手。在任何其他.rb文件中沒有任何對聊天的引用。我檢查過了嗎? – RSG 2011-02-11 07:33:57