2014-09-02 1 views
1

У меня есть класс внутри app/models/user.rb:неопределенный метод `привет» для Gamification :: Пользователь: Модуль

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.new' внутри вашего класса пользователя ruby ​​принимает модуль' User' вместо класса 'User'. Попробуйте ':: User.hello' – BroiSatse

+0

Мы вызываем этот метод из нескольких мест. Я не могу изменить это на все места. Недавно я добавил модуль пользователя. –

+0

Любой другой способ вместо добавления :: к каждому вызову? –

ответ

1

Проблема в том, что вы добавляете все папки из папки lib в свой путь автозагрузки. Когда рельсы удаляют User константу в первый раз, она проверяет эти папки для файла с именем user.rb, прежде чем проверяет пути по умолчанию, такие как app/models. Поскольку такой файл существует, он возвращает класс/модуль, определенные в нем.

Я не думаю, что добавление папок таким образом является наилучшей практикой (из-за этой проблемы). Попробуйте удалить

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

и положить

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

Это, однако, заставит вас использовать полные имена констант, как Gamification::User вместо User.