在Sinatra / Padrino哪里有一个合理的地方可以在路线中添加常数?
我正在使用Padrino来安装多个应用程序,因此我希望所有应用程序都可以使用常量。 (所有应用程序都从基类继承。)
我使用Sinatra.helpers添加在路由中使用的方法。
我希望对常数采用类似的方法。
更新
这似乎是一个范围问题,但我无法弄清楚在这种情况下出了什么问题。
这是一个精简的padrino应用程序,用于演示问题:
app.rb
class MyProject < Padrino::Application
register Padrino::Rendering
register Padrino::Mailer
register Padrino::Helpers
MY_CONST = 123
end
controllers.rb
MyProject.controller do
get "/" do
p self.class # => MyProject
p self.class.constants # => [:DATA_ATTRIBUTES, ... <snip>..., :MY_CONST, ... <snip>... ]
p MyProject::MY_CONST # => 123
p MY_CONST # => NameError - uninitialized constant MY_CONST
end
end
答案 0 :(得分:1)
好的,显然我遇到的问题是Ruby如何在proc_evaled的proc中处理常量查找。
这是一种重建错误的无Padrino方法:
class Thing
MY_CONST = 123
def doStuff (&block)
p "doStuff: #{self.class}" # => "doStuff: Thing"
p "doStuff: #{MY_CONST}" # => "doStuff: 123"
instance_eval &block
end
def doOtherStuff (&block)
p "doOtherStuff: #{self.class}" # => "doOtherStuff: Thing"
p "doOtherStuff: #{MY_CONST}" # => "doOtherStuff: 123"
yield
end
end
t = Thing.new
t.doStuff do
doOtherStuff do
p self.class # => Thing
p self.class.constants # => [:MY_CONST]
p Thing::MY_CONST # => 123
p MY_CONST # => NameError: uninitialized constant MY_CONST
end
end
相关问题:Constant Lookup with instance_eval in Ruby 1.9
相关博文:http://jfire.io/blog/2011/01/21/making-sense-of-constant-lookup-in-ruby/
所以看起来我的选择仅限于:
答案 1 :(得分:0)
apps.rb
Padrino.configure do
set :foo, :bar
end
然后您应该能够在所有应用中检索您的var。
或者在启动或apps.rb中添加如下内容:
MY_CONST = 1
MyConst = 1