2013-10-06 3 views
0

Использование Rails 3.2. У меня есть следующие:DRYer application.yml для констант сайта

# 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

триумфатора, пожалуйста, посмотрите, как работает YAML и что вы можете делать с ним. от того, что вы просите, я вижу, что это будет хорошо для вас.

всегда хорошо читать спецификации. для 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']) 

, чтобы ответить на ваш второй вопрос, нет, это не можно записать код ruby ​​в YAML.

Что вы можете сделать в рельсах, используя метки ERB в файлах YAML для оценки материала. также возможно сортировать объекты в YAML. это, вероятно, не то, что вы хотите.

в вашем случае, я не думаю, что есть какой-то момент в этом подходе. это нехорошее место для обобщения вещей. и если вы действительно думаете, что это того стоит, вы можете просто написать вспомогательный метод для создания заглавной версии и использовать ее в своем коде.

Смежные вопросы