2010-11-09 3 views
0

Итак, моя проблема в том, что у меня есть два класса с тем же именем.Как отличить класс «ClassA» от «Module :: ClassA»?

Первый REXML :: Document, который является сторонней библиотекой.

другая модель ActiveRecord под названием «Документ», управляемая моим приложением.

В моем контроллере, когда я делаю «Document.transaction», он говорит мне, что метод «транзакция» не существует для класса «REXML :: Document», но я действительно хочу использовать мою модель. Моя модель не принадлежит модулю, так как я могу сказать рубину, что он должен искать модель «Документ» вместо «REXML :: Document»?

+0

Я задал аналогичный вопрос, посмотрим, поможет ли он: http://stackoverflow.com/questions/1270227/what-is-the-fully-qualified-name-of-a-model-in-ruby-on -rails – Swanand

ответ

1

::Document говорит Руби, чтобы начать поиск имени на высшем уровне, в отличие от текущего уровня.

Это похоже на путь Unix, где / также функционирует как разделитель компонентов пути, и как флаг, чтобы не использовать относительный поиск.

Однако, если вы находитесь внутри своего контроллера, Document сам по себе должен никогда не относится к REXML::Document. Он должен всегда искать только Document, сначала в текущем пространстве имен, затем на один уровень вверх и т. Д. До тех пор, пока пространство имен верхнего уровня (на самом деле ничего особенного, это просто класс Object).

Если, конечно, у вас нет include REXML где-то в вашем коде, и в этом случае есть еще более простое средство, чем использование ::Document: просто не делайте этого.

+0

Вы правы, сначала нужно искать документ и только затем для REXML :: Document. Я нашел проблему. У нас был помощник, который включал модуль «REXML» в теле файла вне любого класса или модуля, я считаю, что это делает его доступным для любого файла в приложении rails. Я считаю, что могу исправить это, переместив include в модуль, который ему нужен. Однако, для дальнейшего использования, какое более простое средство вы говорите в этой ситуации? Что делать, если мой контроллер включал REXML? Как я могу ссылаться на документ по REXML :: Document? –

0

Да, много дубликатов этого вопроса, я думаю. Ответ, в любом случае, чтобы использовать ::Document хотя я бы подумал, просто набрав Document предпочел бы Document к REXML::Document

+0

Я огляделся и не нашел ответа. Трудно искать вокруг этого предмета, это очень специфично. По какой-то причине приложение одобряло «REXML :: Document» над «Документом». Я узнал, почему. Однако выполнение «:: Document» не фиксировало его. –

Смежные вопросы