2011-02-06 67 views
4

在我的Rails应用我有一个型号/ foo.rb型号/富/ exceptions.rbruby​​类和具有相同名称的模块之间的关系是什么?

class Foo 
    include Foo::Exceptions 
end 

module Foo::Exceptions 
    class MySpecialException < Exception 
    end 
end 

在轨控制台,然后我看到:

>> Foo::MySpecialException 
Foo::Exceptions::MySpecialException < Exception 
>> Foo::MySpecialException == Foo::Exceptions::MySpecialException 
true 
>> Foo::MySpecialException === Foo::Exceptions::MySpecialException 
false 
  1. 你对我的文件结构/命名空间有什么看法?
  2. 是否需要包含Foo的行,还是Rails自动包含这些模块?
  3. 为什么MySpecialException存在于顶层Foo命名空间并指向Foo::Exceptions::MySpecialException
  4. 这是什么意思,这两个类是==但不是===

我在irb中探讨了这个问题,但仍然遇到与我在Rails中看到的行为不一致的错误。

相关:What is a conventional place to keep custom Exception definitions in a rails project?

回答

3

什么是Ruby类和模块具有相同的名称之间的关系?

一个类和一个模块在ruby中不能有相同的完全限定名。可以有一个类Foo::Bar和一个模块Baz::Bar,在这种情况下,类和模块之间没有关系。然而,不可能同时拥有类Foo::Bar和模块Foo::Bar

(我不知道这是什么了,虽然你的问题的其余部分做)

是Foo中我包容行必要的,或确实Rails的autoinclude这些模块?

Rails不会自动包含您的模块。然而,这并不意味着有必要包括自己,你可以只接触它合格。即在Foo类中使用Exceptions::MySpecialException而不是MySpecialException

为什么MySpecialException存在于顶层Foo命名空间并指向Foo :: Exceptions :: MySpecialException?

因为您将Foo::Exceptions纳入Foo。由于Foo::Exceptions的所有实例方法也是Foo的实例方法,并且所有常量Foo::Exceptions也都是Foo的常量 - 包括MySpecialException

这是什么意思,这两个类==而不是===?

==意味着它是相同的类。这不是===意味着该类不是它自己的一个实例(因为x === yy.is_a?(x)相同,如果x是一个类)。

+0

“(我不确定这与你的问题的其余部分有什么关系)” - 因为'module Foo :: Bar'没有暗示'模块'Foo`也存在吗? – 2011-02-07 03:54:24

1
  1. 我建议你移动例外LIB:LIB /异常/ exception_name.rb
  2. Rails会自动加载的东西,在车型目录,但是对于lib文件夹,你得告诉通过检查的config/application.rb中并​​加入该这样做:

    # Custom directories with classes and modules you want to be autoloadable.

    config.autoload_paths += %W(#{config.root}/lib)

    config.autoload_paths += Dir["#{config.root}/lib/**/"]

+0

谢谢!你为什么认为我应该在那里例外?我认为将它们放在其他模型代码旁边很好。 – 2011-02-07 03:59:44

相关问题