如何以轨道方式使用YAML?

时间:2011-07-11 19:57:41

标签: ruby-on-rails yaml

我在我的应用程序中使用YAML进行配置。我使用configatron进行一般配置。但是我有私人配置值(account_id和密码)。

我可以在数据库中创建模型或在我的设置模型中创建一个新行。但是我更喜欢在yml上维护信息

我在config中创建my.yml然后在控制器上读取

yaml_config = YAML::load(ERB.new(IO.read(File.join(RAILS_ROOT, 'config', 'my.yml'))).result)[RAILS_ENV]

所以我想使用像configuratron gem那样的my.yml文件。

即我实际加载YAML并且我想配置my.field_information。

如果我表示不好意思

提前致谢

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但您希望能够使用属性访问您的配置?

然后你可以这样做:

class My
    def initialize
        @config = YAML::load(ERB.new(IO.read( 
                  File.join(RAILS_ROOT, 'config', 'my.yml'))).result)[RAILS_ENV]
    end

    def method_missing(name, *args, &block)
        @config[name.to_s]
    end
end

这将允许您作为属性访问顶级字段。

例如,如果你的my.yml文件看起来像

development:
    user: Me
    password: Mine

然后您可以使用

访问它
my_config = My.new
my_config.user
my_config.password    

当然,这只是一个粗略的例子。如果文件中缺少某些属性,则应添加大量检查和错误处理。

答案 1 :(得分:0)

我刚刚在最后5分钟写了一些相关内容(包括检查yml是否缺失/无效):

mg_yml = YAML::load(File.open("#{RAILS_ROOT}/config/yyy.yml"))
if mg_yml
  mg_yml_env = mg_yml.with_indifferent_access[RAILS_ENV]
  if mg_yml_env
    if mg_yml_env.with_indifferent_access[:password].blank?
      flash[:error] = "<em>config/yyy.yml</em> missing password (blank / missing) for current environment.  You cannot access yyy until you set the password for this environment."
    else
      @password_from_yml = mg_yml_env.with_indifferent_access[:password]
    end
  else
    flash[:error] = "<em>config/yyy.yml</em> missing password for current environment '#{RAILS_ENV}'.  You cannot access yyy until you configure this file for this environment."
  end
else
  flash[:error] = "<em>config/yyy.yml</em> missing.  You cannot access yyy until you configure this file."
end

对于/ config目录中的yyy.yml:

development:
  password: my_dev_pass
test:
  password: my_test_pass
production:
  password: my_production_pass