如何在驻留在父目录中的模块中实例化类的对象?

时间:2015-10-09 16:53:26

标签: ruby-on-rails ruby

我使用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中的常量VA
module 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

关于我为什么要维护这样的目录结构的其他细节:

  1. 在rails api中,我想版本化我的应用程序库(lib目录)
  2. 我会将我的app库维护在comp目录之外。
  3. 另外,请告诉我是否有其他方法可以实现我的应用程序库的版本化

2 个答案:

答案 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