Гибкое конфигурирование приложения на Ruby on Rails

Oct 14
2006 06:27 (Программирование, Ruby on Rails) · English (11,673 views)

В моем текущем проекте на Ruby on Rails нужно хранить конфигурацию приложения. Я нашел несколько подходов к решению этой задачи: плагин AppConfig, несколько методов, описанных на странице Wiki HowtoAddYourOwnConfigInfo, но ни один из них не выглядит “похожим на конфигурационный файл”. Мы с другом, Алексеем Ковыриным, исследовали все, и решили использовать YAML-файл. Идеальной конфигурацией, как мне кажется, является следующий файл:

common:
  support_email: admin@myhost.com
  root_url: myhost.com
  photos_max_number: 6

production:
  email_exceptions: true

development:
  root_url: localhost:3000
  photos_max_number: 10

В этом примере можно увидеть три раздела: common используется как базовая конфигурация для всех окружений, production и development - настройки, специфичные для окружения. Возможными разделами являются production, development и testing, а также любые другие пользовательские имена окружений. Я разместил этот файл в config/config.yml и добавил следующий код в config/environment.rb:

require 'ostruct'
require 'yaml'

config = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/config.yml"))
env_config = config.send(RAILS_ENV)
config.common.update(env_config) unless env_config.nil?
::AppConfig = OpenStruct.new(config.common)

Теперь я могу использовать конструкции вида AppConfig.support_email и AppConfig.root_url. Похоже на то, что мои конфигурационные файлы соответствуют принципу DRY, насколько это возможно :-)

14 отзывов на 'Гибкое конфигурирование приложения на Ruby on Rails'

Подписаться на комментарии по RSS или TrackBack на 'Гибкое конфигурирование приложения на Ruby on Rails'.

1
ed
сказал 17.10.2006 в 11.42

сделать это в yaml и не гадить environment
DRY out your database.yml
Yaml Cookbook там где “merge key”

салют

2
сказал 17.10.2006 в 11.53

Во-первых, лично мне не нравится, как выглядит

common: &common
  support_email: admin@myhost.com
  root_url: myhost.com
  photos_max_number: 6

production:
  <<: *common
  email_exceptions: true

development:
  <<: *common
  root_url: localhost:3000
  photos_max_number: 10

Во-вторых, код все равно останется в виде

config = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/config.yml"))
::AppConfig = OpenStruct.new(config.send(RAILS_ENV))

Имхо, уродство конфига не оправдание программисту, который сэкономил две строчки кода.

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

3
сказал 17.10.2006 в 11.54

Кстати, спасибо за ссылки. Очень полезно :-)

4
Sergey
сказал 29.10.2006 в 12.18

Похожим образом сделана конфигурация в php symfony framework (который появился под воздействем рельсов)

http://www.symfony-project.com/book/trunk/configuration

5
сказал 25.01.2007 в 2.05

Небольшая модификация кода на случай, если секция common не содержит данных или отсутсвует как таковая:

config = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/config.yml"))
env_config = config.send(RAILS_ENV)
common = config.common || {}
common.update(env_config) unless env_config.nil?
::AppConfig = OpenStruct.new(common)
6
сказал 25.01.2007 в 7.08

Спасибо! В некоторых проектах может быть полезно :-)

7
сказал 25.01.2007 в 12.31

Да не за что, мне уже помогло :)

8
сказал 25.04.2007 в 4.34

[...] solutions have been posted for handling application level config file but this solution is by far the best. It’s simple, DRY and works. Try it. You will love [...]

9
сказал 26.07.2007 в 11.29

Many thanks for the great idea. I’ve decided to go further and now config file is parsed with ERB, one can have another file to override the values in the main file (when you place config.yml to svn and need specific values in your working copy) and config values can not be overwritten in the application (by mistake). Please check it out.

10
сказал 08.10.2007 в 1.40

Hi Dmitry,

I have expanded your idea into a plugin: http://agilewebdevelopment.com/plugins/application_configuration

I have been using your setup with great pleasure in couple of last projects.

Many thanks!

Karel

11
сказал 07.01.2008 в 19.55

[...] plugin which does exactly that, using YAML. It’s based on the technique described by Dmytro Shtefluk and uses OpenStruct to parse the config file and supports RAILS_ENV specific settings.Borrowing [...]

12
Alex
сказал 21.02.2008 в 22.36

This code does’t work in ‘test’ environment (Rails 2.0.2).

Problem with:

env_config = config.send(RAILS_ENV)

It’s strange that config.test() work, but confg.send('test') not.
I don’t know why. Can anyone explain this behaivor?

13
сказал 29.02.2008 в 6.32

It works for my Rails 2.0.2 project:

# app-specific config
require 'ostruct'
require 'yaml'
config = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/chef.yml"))
::AppConfig = OpenStruct.new(config.send(RAILS_ENV))

Test:

def test_test_base
    assert_not_nil AppConfig.test_base
  end

Passes. When I change it to assert_nil it fails, and I see that it was actually set.

14
Steve C
сказал 12.07.2008 в 1.48

If you are getting errors when using this in your test environment you forgot to add “test:” to your .yml file

The example in this article had production and dev, but for some reason omits test

Оставить отзыв

Вы можете использовать простые теги форматирования HTML (вроде <a>, <ul> and others). Чтобы вставить пример код, используйте <code lang="php">$a = "hello";</code> (поддерживаемые языки: ruby, php, yaml, html, csharp, javascript). Также Вы можете использовать <code>$a = "hello";</code>, синтаксис не будет подсвечен. Если вы не хотите использовать тег <code>, замените символ < на &lt;.

Отправить

 
Copyright © 2005 - 2008, Dmytro Shteflyuk