在rake任务中访问命名空间类的问题

时间:2011-08-15 06:22:04

标签: ruby-on-rails rake

给定一个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>正确吗?
  3. 顺便说一下,我试过::Namespaced::Klass.first.some_other_method

    如果答案不简单,我会整理一个测试应用程序 - 让我知道! : - )

1 个答案:

答案 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的类定义,包括任何模块/命名空间成员资格。