Ruby Padrino/Sinatra路线中的常数

Ruby Padrino/Sinatra路线中的常数,ruby,sinatra,padrino,Ruby,Sinatra,Padrino,在Sinatra/Padrino,在何处添加常数以便在路线内使用是明智的 我正在使用Padrino挂载多个应用程序,因此我希望所有应用程序都可以使用常量。(所有应用都从基类继承。) 我曾经添加过在路由内部使用的方法 我希望对常数采用类似的方法 更新 这似乎是一个范围问题,但我不知道这个场景中出了什么问题 下面是一个简化的padrino应用程序,它演示了问题: app.rb classmyprojectMyProject p self.class.constants#=>[:DATA_ATTRIB

在Sinatra/Padrino,在何处添加常数以便在路线内使用是明智的

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

我曾经添加过在路由内部使用的方法

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

更新

这似乎是一个范围问题,但我不知道这个场景中出了什么问题

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

app.rb

classmyproject
controllers.rb

MyProject.controller do
得到“/”做
p self.class#=>MyProject
p self.class.constants#=>[:DATA_ATTRIBUTES,…,:MY_CONST,…]
p MyProject::MY_CONST#=>123
p MY_CONST#=>NameError-未初始化常量MY_CONST
结束
结束

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

Padrino.configure do
   set :foo, :bar
end
然后,您应该能够在所有应用程序中检索您的var

或者在boot或apps.rb中添加类似的内容:

MY_CONST = 1
MyConst = 1

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

Padrino.configure do
   set :foo, :bar
end
然后,您应该能够在所有应用程序中检索您的var

或者在boot或apps.rb中添加类似的内容:

MY_CONST = 1
MyConst = 1

好的,显然我遇到了一个问题,Ruby如何处理实例求值过程中的持续查找

以下是一种无需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
相关问题:

相关博文:

因此,我的选择似乎仅限于:

  • 使用全局常量
  • 完全指定常量(例如:上面示例中的Thing::MY_CONST)
  • 改用一种方法

  • 好的,显然我遇到了一个问题,Ruby如何处理实例求值过程中的持续查找

    以下是一种无需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
    
    相关问题:

    相关博文:

    因此,我的选择似乎仅限于:

  • 使用全局常量
  • 完全指定常量(例如:上面示例中的Thing::MY_CONST)
  • 改用一种方法

  • 你可以添加一个类常量,它们应该在任何地方都可用,就像应用程序类中的类变量一样?添加到扩展Padrino::Application的应用程序类的常量在routes中不可用。您可以添加一个类常量,它们应该在任何地方都可用,就像应用程序类中的类变量一样?添加到扩展Padrino::Application的应用程序类的常量在routes.OK中不可用。我现在可以在路线中使用“settings.foo”。这是一个进步:-)我仍然希望我的路线可以使用常量,就像它们是本地的一样(即:无范围)。那不可能吗?再次谢谢。我还假设将该常量添加到app.rb会很好。但我还是有问题。我已经用示例代码更新了这个问题。谢谢。如果您想在全局环境中使用它,请将其保留在类外,否则请查看
    namererror
    的最后一部分,它将显示
    未初始化常量MY_CONST for…
    OK cool。我现在可以在路线中使用“settings.foo”。这是一个进步:-)我仍然希望我的路线可以使用常量,就像它们是本地的一样(即:无范围)。那不可能吗?再次谢谢。我还假设将该常量添加到app.rb会很好。但我还是有问题。我已经用示例代码更新了这个问题。谢谢。如果您想在全局环境中使用它,请将其保留在类外,否则请查看
    namererror
    的最后一部分,它将显示
    未初始化常量MY_CONST for…