Модули пространства имен и Rails 3.1.3 autoload_path - PullRequest
7 голосов
/ 17 февраля 2012

У меня проблемы с пространством имен модуля, который я включаю в модель.

в /app/models/car.rb

class Car
 include Search::Car
end

в /lib/search/car.rb

module Search
  module Car
    include ActiveSupport::Concern
    # methods in here
  end
end

в /config/application.rb

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

Странно то, что я не получаю никаких ошибок напрямую, когда запускаю сервер. Но если я обновлю браузер через некоторое время, я получу эту ошибку:

Expected #{Rails.root}/lib/search/car.rb to define Car

Природа проблемы указывает на то, что она имеет отношение к:

/ конфигурации / среда / development.rb

config.cache_classes = false

Я также попытался поместить файл search.rb непосредственно в /lib, где я определяю Search:

module Search
  # Put shared methods here
end

Что я делаю не так?

UPDATE:

Хорошо, получается, что если я переименую Search::Car в Search::CarSearch, это сработает. Разве нельзя иметь модули / классы с одинаковыми именами в другом объеме?

1 Ответ

4 голосов
/ 16 января 2013

Ошибка исходит от ваших autoload_paths.config.autoload_paths += Dir["#{config.root}/lib/**/"] добавит все каталоги и их подкаталоги в каталог lib.Это означает, что вы говорите rails для автозагрузки каталога lib / search /, поэтому car.rb в этом каталоге должен определять Car, а не Search :: Car.Чтобы rails ожидал, что lib / search / car.rb определит Search :: Car, вам необходимо автоматически загрузить каталог lib /, а не lib / search.если вы измените автозагрузку на config.autoload_paths += Dir["#{config.root}/lib/"] и поместите search.rb в lib / со следующим кодом:

module Search
  require 'search/car'
end

, тогда rails поймет и ожидает, что lib / search / car.rb определит Search :: Carссылка на модуль / класс Car в других местах вашего кода не будет ссылаться на этот car.rb.

Вы должны удалить эту строку (у вас должна быть только автозагрузка для каталога lib): config.autoload_paths += Dir["#{config.root}/lib/search/*"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...