我正在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):
我认为这是我对名称空间所做的错误操作。提前致谢。
答案 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
但是,我想这是个人喜好问题。