我使用Rails构建api,我有以下目录结构
|-- api
| |-- api_controller.rb
| |-- v1
| | |-- login_controller.rb
| | |-- comp
| | | |-- login
| | | | |-- clogin.rb
| | |-- lib
| | | |-- session.rb
这里我尝试以login_controller - >的方式访问clogin - >会议。 从login_controller.rb我可以使用下面的代码
访问clogin.rb中的常量VAmodule API::V1
class LoginController < API::ApiController
def index
require_relative 'comp/login/clogin'
comp = Comp::Login::Clogin::VA
end
end
end
但是从clogin.rb,我无法在session.rb中访问常量VB。
clogin.rb:
require_relative '../../lib/session'
module API::V1::Comp::Login
class Clogin
VA
def intialize()
VA = Lib::Session::VB
end
end
end
session.rb:
module API::V1::Lib
class Session
VB
def intialize()
VB = "accessing Lib"
end
end
end
关于我为什么要维护这样的目录结构的其他细节:
另外,请告诉我是否有其他方法可以实现我的应用程序库的版本化
答案 0 :(得分:1)
首先,您尝试使用的方法是initialize
而不是intialize
。其次,当通过MyClass.new
实例化您的类的实例时,会调用它。在您的代码中,这将导致动态重新分配常量,这将引发异常。
你可以这样做:
module API::V1::Lib
class Session
VB = "accessing Lib"
end
end
module API::V1::Comp::Login
class Clogin
VA = Lib::Session::VB
end
end
您也可以尝试将lib目录添加到自动加载路径(请参阅http://edgeguides.rubyonrails.org/configuring.html),这样您就不需要在任何地方require_relative
答案 1 :(得分:0)
为了得到上述答案,clogin.rb进行了一些小改动。
session.rb
module API::V1::Lib
class Session
VB = "accessing Lib"
end
end
clogin.rb
require_relative '../../lib/session'
module API::V1::Comp::Login
class Clogin
VA = API::V1::Lib::Session::VB
end
end