【问题标题】:problem accessing namespaced class in rake task在 rake 任务中访问命名空间类的问题
【发布时间】:2011-08-15 06:22:03
【问题描述】:

给定一个引用命名空间和非命名空间模型的 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

如果答案不简单,我会制作一个测试应用 - 请告诉我! :-)

【问题讨论】:

  • 我猜这个测试应用可能有用:)

标签: ruby-on-rails rake


【解决方案1】:

首先,关于隐喻剪切的一些背景 - 两种不同的命名空间:

虽然 Rake 命名空间和 Ruby 命名空间共享命名空间这个词,但它们是不同的概念。 Rake 命名空间只是为 Rake 任务组织容器,而不是 Ruby 命名空间/模块。所以你的东西中的代码:thingo rake 任务实际上是在顶级 Ruby 命名空间中执行的。

第二:如果Klass是一个不在命名空间中的单个类,可以直接引用。如果类以 Foo::Klass 的形式存在,那么您需要使用完全限定的 Foo::Klass 引用,除非引用的范围已经在 Foo 命名空间内。

因为 Rake 命名空间不是 Ruby 模块,所以您不在任务中的 Ruby 命名空间的上下文中。这就是为什么如果 Klass 不在模块中,Klass.some_method 可以工作的原因。

如果这不能解释问题,请发布 Klass 的类定义,包括任何模块/命名空间成员资格。

【讨论】:

  • 您好 Winfield,很抱歉延迟回复。我明白你在说什么,我很抱歉我没有更清楚。我实际上根本不是指命名空间的 rake 版本。我也被告知这不是默认行为,它是我们应用程序特有的。我会减少它并尽快找到原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多