2014-09-02 50 views
1

我有一個類內app/models/user.rb未定義的方法`你好」爲遊戲化::用戶:模塊

class User 
    include Gamification::User 

    def self.hello 
    puts "hello" 
    end 

end 

我有內部lib/gamification/user.rb一個模塊:

module Gamification 
    module User 
    extend ActiveSupport::Concern 

    module ClassMethods 

    end 
    end 
end 

我有另一個模型AP /型號/conversation.rb

class Conversation 

    def hello 
     User.hello 
    end 

end 

config/application.rb

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

當我點擊Conversation.new.hello那麼我希望它應該打印"hello"。但它返回:

undefined method `hello' for Gamification::User:Module. 

我在做什麼錯在這裏?

+0

這似乎是一個命名衝突 - 當您在User類中調用User.new時,ruby將使用模塊User而不是User'類。試試':: User.hello' – BroiSatse 2014-09-02 21:29:40

+0

我們從多個地方調用這個方法。我無法改變這個每一個地方。我剛剛添加了用戶模塊。 – 2014-09-02 22:19:12

+0

任何其他方式,而不是追加::每個電話? – 2014-09-02 22:19:32

回答

1

問題是,您將lib文件夾中的所有文件夾添加到自動加載路徑。當rails第一次點擊User不變時,它會檢查這些文件夾中是否存在名爲user.rb的文件,然後檢查app/models之類的默認路徑。由於存在這樣的文件,它將返回在其中定義的類/模塊。

我不認爲以這種方式添加文件夾是最好的做法(由於這個問題)。嘗試刪除

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

,並把

config.autoload_paths << "#{config.root}/lib/" 

然而,這將迫使你使用完全合格的常量的名字,像Gamification::User,而不是User

相關問題