【发布时间】:2013-01-30 12:09:02
【问题描述】:
在 sinatra 中我有以下内容:
config = YAML.load_file('sinatra_resources/server.yml')
usernamedk = config["dkuser"]
passworddk = config["dkpass"]
passwordse = config["sepass"]
usernamese = config["seuser"]
database = config["database"]
cpooldk = OCI8::ConnectionPool.new(1, 5, 2, usernamedk, passworddk, database)
cpoolse = OCI8::ConnectionPool.new(1, 5, 2, usernamese, passwordse, database)
当我在路由中使用这些值中的任何一个时,它都可以正常工作。但是我想在函数中使用它们,当我引用这些变量等时。
作为我的问题的一个例子,如果我有一个函数
def getuser(lang)
if lang == "se" then
return usernamese
else
return usernamedk
end
并且在我拥有的路线内 用户 = 获取用户(语言)
然后当我尝试使用 lang = "se" 调用它时,我发现变量 usernamese 未定义.. 同样的事情适用于我想在多个路由之间共享的函数中使用的所有变量。
我尝试了以下方法: 配置做
set :env, "local"
set :usernamedk, config["dkuser"]
set :passworddk, config["dkpass"]
set :passwordse, config["sepass"]
set :usernamese, config["seuser"]
set :database, config["database"]
set :cpooldk, OCI8::ConnectionPool.new(1, 5, 2, setting.usernamedk, setting.passworddk, setting.database)
set :cpoolse, OCI8::ConnectionPool.new(1, 5, 2, setting.usernamese, setting.passwordse, setting.database)
end
但我得到了错误 undefined local variable or method `usernamedk' for main:Object (NameError)
【问题讨论】:
-
变量范围在您的
getuser示例中是本地的。变量不可用。你能显示更多代码吗?您使用的是经典模式还是模块化模式? -
我同意@jordelver,您应该提供更多代码,因为您正在谈论范围,但很难知道问题出在哪里。例如,函数在哪里定义?这一切都在一个文件中并且您使用的是 Sinatra 的经典模式吗?
-
这一切都在一个文件中,所以我想从这里sinatrarb.com/extensions.html 它将被视为经典模式。我最终只是创建了一堆全局变量,因为这让我可以做我想做的事 - 以前没有考虑过,而且拥有这么多全局变量也是一种非常糟糕的形式。