Ruby on rails 3.2 constantize错误地返回顶级类而不是NameError

Ruby on rails 3.2 constantize错误地返回顶级类而不是NameError,ruby-on-rails-3.2,ruby-2.1,Ruby On Rails 3.2,Ruby 2.1,我们最近将Rails 3.2.16应用程序升级到Ruby 2.1.0。我开始在一些传统路由上看到路由错误,这些路由仅依赖于模式匹配: match ':controller(/:action(/:id(.:format)))' 我发现我们有一个控制器,其操作与另一个顶级控制器的“控制器名称”匹配。例如: class FoosController < ApplicationController end class BarsController < ApplicationControl

我们最近将Rails 3.2.16应用程序升级到Ruby 2.1.0。我开始在一些传统路由上看到路由错误,这些路由仅依赖于模式匹配:

match ':controller(/:action(/:id(.:format)))'
我发现我们有一个控制器,其操作与另一个顶级控制器的“控制器名称”匹配。例如:

class FoosController < ApplicationController
end

class BarsController < ApplicationController
  def foos
  end
end
这不对吗?由于未定义
Bar::Foo
,因此应引发
NameError
。这是目前打破我们的路线,但我想它可能会打破很多其他地方了


更新2014-3-18:我能够在irb Ruby 1.9.3(没有Rails)中重现同样的行为,因此
constantize
没有问题,或者是
constantize
在Ruby 2.1.0中如何工作的问题


实际的类名是
pdufirmware升级控制器
(具有
#pdus
操作)和
PdusController
。我不确定除了将操作重命名为独特的名称之外还能做什么。

是否涉及任何名称空间?你能用你用的真名替换这些名字吗?当你定义一个类时,你最终在
对象上定义了一个常量,这就是为什么你可以调用
(对象::)Bar::Foo
,我不认为这是错误的根源。@phoet对不起,我刚才看到了你的回答并更新了问题。赏金将在7小时后结束,但如果你认为你能帮忙的话,我会重新打开它。
001:0> class Foo; end
nil
002:0> class Bar; end
nil
003:0> Bar::Foo.name
(irb):3: warning: toplevel constant Foo referenced by Bar::Foo
"Foo"