给定一个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>
undefined method 'some_method' for #<Klass:0x007fcfafbaa6e0>
正确吗?顺便说一下,我试过::Namespaced::Klass.first.some_other_method
如果答案不简单,我会整理一个测试应用程序 - 让我知道! : - )
答案 0 :(得分:0)
首先,关于隐喻剪切的一些背景 - 两种不同的命名空间:
虽然Rake Namepsaces和Ruby Namespaces共享Namespace这个词,但它们是独立的概念。 Rake命名空间只是为Rake Tasks组织容器,而不是Ruby命名空间/模块。所以你的东西中的代码:thingo rake任务实际上是在顶级Ruby命名空间中执行的。
第二:如果Klass是不在命名空间中的单个类,则可以直接引用它。如果该类以Foo :: Klass存在,那么除非引用的范围已经在Foo命名空间内,否则您将需要使用完全限定的Foo :: Klass引用。
因为Rake命名空间不是Ruby模块,所以您不在任务中的Ruby命名空间的上下文中。这就是Klass.some_method如果Klass不在模块中的原因。
如果这不能解释问题,请发布Klass的类定义,包括任何模块/命名空间成员资格。