动态获取Sinatra中的嵌套设置

时间:2014-10-08 22:37:10

标签: ruby sinatra

在Sinatra中(使用Sinatra :: Configfile)使用settings.foo这样的设置非常简单,但是如果你需要将你的设置放在一个层次结构中,那么如何在一个层次结构中进行设置并不是很明显。简单直接的方式。

这很痛苦:

get '/test' do
  case settings.environment
  when :production
    settings.production['foo'] 
  else
    settings.development['foo'] 
  end
end

更接近这一点会好得多,但这不起作用:

get '/test' do
  settings[settings.environment]['foo'] 
end

3 个答案:

答案 0 :(得分:3)

您可以使用send使用字符串调用对象上的方法。

get '/test' do
  settings.send(settings.environment.to_s)['foo'] 
end

答案 1 :(得分:1)

您在寻找configure吗?

set :foo, "default value\n" # or explicitly set for each environment 
                            # with different configure blocks

configure :production do
  set :foo, "production\n"
end

get '/test' do
  settings.foo
end

答案 2 :(得分:1)

我相信这就是你想要的。

在Sinatra应用程序的顶部添加以下内容。

require 'sinatra/config_file'
config_file './config/config.yml' # Point to wherever you want to store your config.yml

# Within your config.yml specify per environment settings; very similar to Rails
development:
  database: sqlite://../bigtunadev.db
  cipher: lamecipher4dev
  oracle: 
    user: oracle_user 
    password: oracle_password
  db2:
    user: db2_user
    password: db2_password
  mysql:
    user: mysql_user
    password: mysql_password

production:
  database: sqlite://../bigtunaprod.db
  cipher: wA7Th1515@n@w3s0m3c1p43r

默认情况下,仅支持test, production, and development个环境。

如果您想添加其他环境,则必须在配置中覆盖它,如下所示。

set :environments, %w{development test production staging}

这将直接在当前环境的设置上公开属性。


在开发部分注意我添加了额外的嵌套。

多级嵌套必须作为哈希访问,因此它看起来如下所示。

settings.oracle["user"]