2013-03-19 2 views
6

Я работаю с некоторым старым RoR-кодом, который имеет четыре связанных класса, каждый из которых определяется в собственном файле. Все эти классы являются классами парсера и живут в приложениях/моделях/парсерах. Каждое имя файла заканчивается _parser.rb.Ruby - :: in class name

Вот пример класс Защита строка из файла adf_parser.rb:

class Parsers::AdfParser 

Я потерял, как к тому, что Парсеры :: часть того, что делает.

  • Нет явного модуля под названием Parsers, который определяется где угодно, где я могу найти.
  • Я не вижу никакой документации о неявном создании модулей, просто добавляя спецификации модулей к именам классов.
  • Единственная внешняя зависимость - «требуется» csv ».
  • В классе def есть предложения, но я не думаю, что у них есть что-то, что могло бы объяснить имя класса.
  • Я создал новый тестовый проект RoR и поместил заглушки этих файлов в параллельный каталог, и они не будут запускаться из командной строки из-за ошибки имени .
  • Я не вижу примеров онлайн классов, названных таким образом.

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

Обновление: похоже, что это всего лишь магия Rails, основанная на имени подкаталога. Я думаю, причина, по которой я получил ошибку в своем тестовом приложении, заключается в том, что я просто запускал файлы через интерпретатор ruby, а не вызывал их с Rails в некотором роде.

+0

Это просто пространство имен. Что вы пытаетесь выяснить? –

+0

Какая ошибка вы получаете в командной строке? Как @DaveNewton сказал, что это просто пространство имен. Вы можете сделать это My :: Fancy :: Parsers :: AdfParser, если хотите, но каждый раз вам придется обращаться к нему так. – awbergs

+2

@ Давно, но пространство имен должно быть определено где-то. Я думаю, что OP говорит, что они не могут найти определение модуля 'Parsers', поэтому задается вопросом, происходит ли что-то особенное. – mikej

ответ

6

class Parsers::AdfParser в практике эквивалентном:

module Parsers 
    class AdfParser 

Для этого, чтобы работать должным образом, и файл будет автоматически загружаются его расположение должно быть парсеры/adf_parser.rb, будь то под приложение/модели или Lib. В основном путь к файлу должен имитировать иерархию классов.

+0

Это то, о чем я думал, но когда я создал новый проект-фиктивный файл и попытался установить аналогичный класс defs в папке парсеров, я получил ошибку имени. Должны ли файлы классов создаваться через рельсы, чтобы сделать эту работу? – whognu

+0

Я пробовал это сам в 'lib /', и это не сработало, поэтому мой неправильный ответ (который я с тех пор проголосовал за удаление).Как только я попробовал несколько имен имен имен, таких как «app/models /», все это сработало. Ухоженная. – BaronVonBraun

+1

Классы не нужно создавать через генераторы рельсов. Однако они должны находиться под дорогой, которую автоматически загружает Rails, которая устанавливается в config/application.rb. Обычно у вас будет 'config.autoload_paths + = Dir [" # {config.root}/app/models/**/"]' и то же для lib. Затем вы можете писать такие вещи, как 'Parser.adfParser.new' – boulder

3

Это в подкаталоге parsers модулей; Rails пространства имен для вас по соглашению.

+0

@ user1476065 Как Дэйв Саид, поскольку весь файл ur находится внутри подкаталога« парсеры »и пространства имен Rails – Viren