0

使用 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
4

1 回答 1

1

victor,请看看 YAML 是如何工作的以及你可以用它做什么。从您的要求中,我可以看出这对您来说是一件好事。

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

回答您的问题:

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

如果您查看为此使用的代码:

YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__)))[Rails.env]

很明显,这种方法根本行不通,因为它需要配置Rails.env. 因此,解决该问题的一个非常简单的解决方案是将您的全局配置放在 key 下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。这可能都不是你想要的。

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

于 2013-10-06T09:27:24.500 回答