проблема с доступом к пространству имен в грабли - PullRequest
2 голосов
/ 15 августа 2011

Учитывая задачу rake, которая ссылается как на модель пространства имен, так и на модель без пространства имен:

namespace :thing do
  task :thingo => :environment do
    Klass.first.some_method
    Namespaced::Klass.first.some_other_method
  end
end

Используя ruby ​​1.9.2, rails 3.0.9 и rake 0.9.2, это дает исключение, напримерИтак:
undefined method 'some_other_method' for #<Klass:0x007fcfafbaa6e0>

Две вещи:

  1. Почему rails не возвращает правильное пространство имен в среде rake (в сеансе отладчика), но это происходит вконсольный сеанс?
  2. Почему работает изменение порядка ссылок?(То есть, если среда уже называет «Namespaced :: Klass» как «Klass», то вызов «Klass» должен завершиться с undefined method 'some_method' for #<Klass:0x007fcfafbaa6e0> верно?

Кстати, япопробовал ::Namespaced::Klass.first.some_other_method

Если ответ не простой, я соберу тестовое приложение - дайте мне знать!: -)

1 Ответ

0 голосов
/ 21 августа 2011

Во-первых, некоторые сведения о сдвиге метафоры - два различных типа пространств имен:

Хотя пространства имен Rake и пространства имен Ruby совместно используют слово пространство имен, они представляют собой отдельные понятия.Пространства имен Rake - это просто организующие контейнеры для задач Rake, а не пространства имен / модули Ruby.Итак, код внутри вашей вещи: задача thingo rake фактически выполняется в пространстве имен Ruby верхнего уровня.

Второе: если Klass - это отдельный класс, не входящий в пространство имен, вы можете ссылаться на него напрямую.Если класс существует как Foo :: Klass, то вам нужно будет использовать полную ссылку Foo :: Klass, если только область действия ссылки уже не находится в пространстве имен Foo.

Поскольку пространства имен Rake не являютсяМодули Ruby, вы не находитесь в контексте пространства имен Ruby в вашей задаче.Вот почему Klass.some_method работает, если Klass не находится в модуле.

Если это не объясняет вопрос, пожалуйста, опубликуйте определение класса для Klass, включая любое членство в модуле / пространстве имен.

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