1

シナトラでは、私は次のものを持っています:

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

しかし、main:Object(NameError)のエラー未定義のローカル変数またはメソッド`usernamedk'が返されました

4

2 に答える 2

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
于 2013-01-31T16:29:25.633 に答える
1

変数にはローカルスコープしかありません。それらはインスタンス変数ではありません。@などのプレフィックスを付けてインスタンス変数として使用することも@ 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

それが役立つことを願っています

于 2013-01-30T18:25:38.070 に答える