命名空间Ruby错误

时间:2018-08-01 22:14:35

标签: ruby-on-rails ruby ruby-on-rails-5

我正在Ruby on Rails项目中尝试一些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 个答案:

答案 0 :(得分:2)

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

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