在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
并且在我的路线内 user = getuser(lang)
然后当我尝试用lang =“se”调用它时,我得到变量usernamese未定义.. 同样的事情适用于我想要在多个路由之间共享的函数中使用的所有变量。
我尝试了以下内容: configure do
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
但我找回了错误未定义的局部变量或方法`usernamedk'for main:Object(NameError)
答案 0 :(得分:2)
当您可以将配置作为哈希访问时,为什么要烦扰所有变量?
configure do
# no need to set the env as local if you're trying to affect the scope
config = YAML.load_file('sinatra_resources/server.yml')
set :config, config
set :cpooldk, OCI8::ConnectionPool.new(1, 5, 2, config["dkuser"], config["dkpass"], config["database"])
set :cpoolse, OCI8::ConnectionPool.new(1, 5, 2, config["seuser"], config["sepass"], config["database"])
end
helpers do
def getuser(lang)
if lang == "se" then
settings.config["seuser"] # no need for the explicit returns in Ruby
else
settings.config["dkuser"]
end
end
end
get "/some-route" do
get_user("se")
end
答案 1 :(得分:1)
您的vars只有本地范围,它们不是实例变量。您可以使用@
前缀@ usernamedk
作为实例变量,也可以将所有这些变量用作设置(参见https://github.com/sinatra/sinatra#configuration):
configure do
set :usernamedk = config["dkuser"]
set :passworddk = config["dkpass"]
set :passwordse = config["sepass"]
set :usernamese = config["seuser"]
set :database = config["database"]
end
def getuser(lang)
if lang == "se" then
return settings.usernamese
else
return settings.usernamedk
end
希望有所帮助