Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby模块常量设置和读取_Ruby_Sinatra - Fatal编程技术网

Ruby模块常量设置和读取

Ruby模块常量设置和读取,ruby,sinatra,Ruby,Sinatra,我正在开发一个包含标准方法以及CLI(Thor)和API(Sinatra)的模块。我创建了一个子模块,其中包含一个继承Sinatra::Base的类: module Monteverde module Activity def self.version "1.0.1" end class API < Sinatra::Base set :port, 22340 get "/version" do Montev

我正在开发一个包含标准方法以及CLI(Thor)和API(Sinatra)的模块。我创建了一个子模块,其中包含一个继承Sinatra::Base的类:

module Monteverde
  module Activity
    def self.version
      "1.0.1"
    end

    class API < Sinatra::Base
      set :port, 22340
      get "/version" do
        Monteverde::Activity.version
      end
      run! if defined? Monteverde::OPERATION
    end
  end
end
蒙特维德模块 模块活动 def自我版本 "1.0.1" 结束 类API 此“活动”是从CLI(Thor)调用的:

蒙特维德模块 类CLI 如果我不在Sinatra的跑步中添加“如果”!它将自动运行并接管模块中的其余方法:

...
class API < Sinatra::Base
  register Sinatra::DefaultRoutes
  set :port, 22340
  get "/version" do
    Monteverde::Activity.version
  end
  run!
end

$ ruby monteverde.rb aversion
$ == Sinatra (v2.0.0) has taken the stage on 22340 for development with backup from Puma
$ ...
。。。
类API
我的问题是,即使在调用模块之前设置了操作常量,也无法识别它

为什么手术没有被识别?我如何才能识别?
有没有其他更直观/有用的方法让Sinatra在我调用模块时不开火?

在API类定义中,运行
行将在您需要该文件时立即执行。如果引用该类,它将不会再次运行,正如您尝试使用
defapi
方法的最后一行所做的那样

要解决此问题,您可以移动
运行命令编码到方法中,并从Thor调用该方法:

class API < Sinatra::Base
  # ... other stuff
  def self.start
    run! if defined? Monteverde::OPERATION
  end
end
你可以推断
运行
是一个类方法,因为它可以在类定义的范围内调用(而不是在实例方法中),所以我定义了一个类方法来调用它

不过,如果不定义
def self.start
,而只调用
run方法:

def api
  Monteverde::Activity::API.run!
end

是否会定义更明确的
monterverde.const_?“操作”
work?问题是,当Sinatra::Base继承API类时,无法识别常量。我需要找到一种在API类中包含外部变量/常量的方法。很好的答案!我从没想过这会像叫run这么简单!直接的。
 def api
   Monteverde.const_set("OPERATION", "started")
   Monteverde::Activity::API.start
 end
def api
  Monteverde::Activity::API.run!
end