Padrino / Sinatra路线的常数

时间:2012-09-19 09:40:38

标签: ruby sinatra padrino

在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

2 个答案:

答案 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. 使用全局常量
  2. 完全指定常量(例如:上例中的Thing :: MY_CONST)
  3. 使用方法

答案 1 :(得分:0)

嗯,也许我不明白,但你可以使用apps.rb

Padrino.configure do
   set :foo, :bar
end

然后您应该能够在所有应用中检索您的var。

或者在启动或apps.rb中添加如下内容:

MY_CONST = 1
MyConst = 1