1

在 Sinatra/Padrino 中,哪里是添加常量以供在路由内部使用的合理位置?

我正在使用 Padrino 挂载多个应用程序,因此我希望所有应用程序都可以使用常量。(所有应用程序都继承自基类。)

我使用Sinatra.helpers添加在路由内部使用的方法。

我希望对常量采用类似的方法。

更新

这似乎是一个范围界定问题,但我无法弄清楚这种情况下出了什么问题。

这是一个简化的 padrino 应用程序,它演示了这个问题:

应用程序.rb

class MyProject < Padrino::Application
  register Padrino::Rendering
  register Padrino::Mailer
  register Padrino::Helpers

  MY_CONST = 123
end

控制器.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
4

2 回答 2

1

好的,所以显然我遇到了一个问题,即 Ruby 如何在 instance_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

相关问题:在 Ruby 1.9 中使用 instance_eval 进行常量查找

相关博文:http: //jfire.io/blog/2011/01/21/making-sense-of-constant-lookup-in-ruby/

所以看起来我的选择仅限于:

  1. 使用全局常量
  2. 完全指定常量(例如:上例中的 Thing::MY_CONST)
  3. 改用方法
于 2012-09-24T07:52:31.347 回答
0

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

Padrino.configure do
   set :foo, :bar
end

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

或在 boot 或 apps.rb 添加一些类似:

MY_CONST = 1
MyConst = 1
于 2012-09-19T15:12:52.540 回答