代码之家  ›  专栏  ›  技术社区  ›  Cannon Moyer

命名空间Ruby出错

  •  0
  • Cannon Moyer  · 技术社区  · 7 年前

    我正在一个RubyonRails项目中试验一些Ruby代码,并尝试用继承来编写一个嵌套的名称空间。

    app/messages/message.rb 我有以下代码:

    module Messages
       class Message
           def initialize
               puts "message constructor"
           end
       end
    end
    

    app/messages/emails/email.rb 我有这个代码:

    module Emails
        class Email < Messages::Message
            def initialize
                super
                puts "email constructor"
            end
        end
    end
    

    在Rails应用程序的控制器中,我尝试实例化一个新的 Email 像这样:

    message = Messages::Emails::Email.new
    

    我得到以下错误:

    LoadError (Unable to autoload constant Messages::Emails::Email, expected /home/ubuntu/workspace/app/messengers/messages/emails/email.rb to define it):
    

    我假设这是我对名称空间所做的错误操作。事先谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   jvillian    7 年前

    Rails忽略下面的文件夹名 app . 所以,创造 app/messages/messages/message.rb 类似:

    module Messages
      class Message
        def initialize
          puts "message constructor"
        end
      end
    end
    

    然后, app/messages/emails/email.rb 应该是:

    module Emails
      class Email < Messages::Message
        def initialize
          super
          puts "email constructor"
        end
      end
    end
    

    那么你会的

    Emails::Email.new
    

    这个文件结构有点不成熟,但它应该做到这一点。

    我个人认为我会 app/messages/messages/message_base.rb :

    module Messages
      class MessageBase
        def initialize
          puts "message constructor"
        end
      end
    end
    

    app/messages/messages/email.rb :

    module Messages
      class Email < MessageBase
        def initialize
          super
          puts "email constructor"
        end
      end
    end
    

    但是,我想这是个人喜好的问题。