使用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
答案 0 :(得分:1)
阅读规范总是一件好事。对于YAML来说,这些实际上已经做得很好并且可读:http://www.yaml.org/spec/1.2/spec.html#id2708649
回答你的问题:
首先,如果我理解正确,您希望在YAML文件中具有非特定于环境的全局配置选项。在你的情况下它是site_name_lowercase
和
site_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中。这可能不是你想要的。
在你的情况下,我认为这种方法没有任何意义。这不是一个概括事物的好地方。如果你真的认为这是值得的,你可以编写一个帮助方法来创建一个标题化版本并在你的代码中使用它。