Ruby уже использует имя класса моей модели - PullRequest
1 голос
/ 23 апреля 2010

Я делаю приложение на форуме с различными уровнями авторизации, одним из которых является монитор. Я делаю это, расширяя свой класс User, и я планирую настроить его с помощью классов "-ship" (например, администрация, авторство, модерация и т. Д.). Видимо, класс Monitor является частью ruby ​​ mixin . Как сохранить имя ресурса без коллизий?

Ответы [ 3 ]

6 голосов
/ 23 апреля 2010

Некоторые возможности:

  • избегайте вызова require 'monitor.rb', который вызывает стандартный экземпляр монитора
  • выполнить магию во время выполнения, чтобы переименовать существующий класс Monitor.
  • Обезьяна с вашим путем загрузки, так что require 'monitor.rb' извлекает пустую реализацию Monitor.

Но во всех случаях вы можете столкнуться с ситуацией, когда сторонняя библиотека использует Monitor, ожидая, что это будет стандартный класс Monitor. Итак, я бы посоветовал против любого из вышеперечисленного.

Я бы сказал, что у вас есть только два разумных варианта:

A) вы можете поместить свой класс в пространство имен:

Module MyApp
  class Monitor
    #...
  end
end

если ваше приложение использует какую-то магию с автоматическим требованием (например, это приложение rails), то вы должны поместить свою реализацию в /my_app/monitor.rb Если вы хотите сослаться на этот класс, вы будете делать что-то вроде my_monitor = MyApp::Monitor.new() или что-то еще.

B) вы можете использовать другое имя класса:)

2 голосов
/ 10 ноября 2010

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

Я работаю над большим унаследованным приложением, которое, к сожалению, имеет модель «Fixture», которая довольноважно и который используется везде.При запуске тестов невозможно создать экземпляр Fixture из-за класса Fixture, используемого ActiveRecord при запуске тестов.Поэтому я сделал следующее:

FixtureModel = Fixture.dup

Это замораживает мой класс на месте, так что я могу ссылаться на него позже (но только в моих тестах!) Без расширения классом ActiveRecord Fixture (который не является пространством имен)

2 голосов
/ 23 апреля 2010

Объявите ваш класс Monitor в другом модуле.

module MyModule

  class Monitor

  end

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