DRYer application.yml用于站点范围的常量

时间:2013-10-06 08:02:13

标签: ruby-on-rails yaml

使用Rails 3.2。我有以下内容:

# application.rb
APP_CONFIG = YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__)))[Rails.env]

# application.yml
development: &non_production_settings
  site_url: http://goodboy.com
  site_name_lowercase: good boy
  site_name_titleize: Good Boy

production:
  site_url: http://goodboy.com
  site_name_lowercase: good boy
  site_name_titleize: Good Boy

首先,我想设置一个站点范围的配置,但它无法找到常量:

site_name_lowercase: good boy
site_name_titleize: Good Boy

development: &non_production_settings
  site_url: http://goodboy.development

production:
  site_url: http://goodboy.com

其次,我知道这是一个YAML文件,但无论如何我都可以使用这样的Rails方法:

site_name_lowercase: good boy
site_name_titleize: site_name_lowercase.titleize

1 个答案:

答案 0 :(得分:1)

胜利者,请了解YAML的工作原理以及您可以用它做些什么。根据你的要求,我可以看出这对你来说是件好事。

阅读规范总是一件好事。对于YAML来说,这些实际上已经做得很好并且可读:http://www.yaml.org/spec/1.2/spec.html#id2708649

回答你的问题:

首先,如果我理解正确,您希望在YAML文件中具有非特定于环境的全局配置选项。在你的情况下它是site_name_lowercasesite_name_titleize。这两个键都在你的YAML文件的顶层,因此完全没有范围。

如果您查看您正在使用的代码:

YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__)))[Rails.env]
很明显,这种方法根本不起作用,因为它采用Rails.env范围的配置。 因此,针对该问题的一个非常简单的解决方案是将您的全局配置置于密钥global

global:
  site_name_lowercase: good boy
  site_name_titleize: Good Boy

development: &non_production_settings
  site_url: http://goodboy.development

production:
  site_url: http://goodboy.com

并使用它:

document   = YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__)))
APP_CONFIG = document[Rails.env].merge(document['global'])

回答你的第二个问题,不,在YAML中编写ruby代码是不可能的。

您可以在rails中执行的操作是在YAML文件中使用ERB标记来评估内容。也可以将对象编组到YAML中。这可能不是你想要的。

在你的情况下,我认为这种方法没有任何意义。这不是一个概括事物的好地方。如果你真的认为这是值得的,你可以编写一个帮助方法来创建一个标题化版本并在你的代码中使用它。