Мне было интересно, как добавить настраиваемые переменные конфигурации в приложение rails и как получить к ним доступ в контроллере, например, я хочу иметь возможность определять файл upload_directory в файлах конфигурации, сообщает development.rb и иметь доступ к нему в один из моих контроллеров.
Во-вторых, я планировал иметь поддержку S3 для загрузки в моем приложении, если бы я хотел добавить файл yaml с секретным ключом s3, как его инициализировать в моем приложении Rails и как получить доступ к значениям, которые Я определил в этом файле конфигурации.
Обновление 1
Очень рекомендуется: я собираюсь с Rails Config gem в настоящее время для мелкозернистого элемента управления, который он предоставляет.
Update2
Если вам нужно быстрое решение, а затем проверьте ответ Джека Пратт ниже.
Хотя мой первоначальный ответ ниже все еще работает, этот ответ устарел. Я рекомендую посмотреть обновления 1 и 2.
Оригинальный ответ:
Для быстрого решения, просмотр файла конфигурации YAML сделанного Райаном Бейтсом, должен быть очень полезным.
Вкратце:
# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
# application.rb
if APP_CONFIG['perform_authentication']
# Do stuff
end
В Rails 3 специальные пользовательские данные конфигурации приложения могут быть помещены в объект конфигурации приложения. Конфигурация может быть назначена в файлах инициализации или файлах среды - скажем для данного приложения MyApp
:
MyApp::Application.config.custom_config_variable = :my_config_setting
или
Rails.configuration.custom_config_variable = :my_config_setting
Чтобы прочитать настройку, просто вызовите конфигурационную переменную без ее настройки:
Rails.configuration.custom_config_variable
=> :my_config_setting
UPDATE Rails 4
В Rails 4 есть новый способ для этого = > http://guides.rubyonrails.org/configuring.html#custom-configuration
В Rails 3.0.5 для меня работал следующий подход:
В config/environments/development.rb
напишите
config.custom_config_key = :config_value
Затем значение custom_config_key
может ссылаться на другие файлы с помощью
Rails.application.config.custom_config_key
undefined method
.
method_missing': undefined method
хранилище method_missing': undefined method
" для # <Rails :: Application :: Configuration: 0x007f9f735b7240> ... ". Я пытался добавить переменную config.store.works.
Это работает в рельсах 3.1:
в config/environment.rb(или в config/environment/.. для целевой среды):
YourApp::Application.config.yourKey = 'foo'
Это будет доступно в контроллере или в виде:
YourApp::Application.config.yourKey
(YourApp следует заменить на ваше имя приложения.)
Примечание. Это код Ruby, поэтому, если у вас много ключей конфигурации, вы можете сделать это:
в config/environment.rb:
YourApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
Предполагая, что вы помещаете свои пользовательские переменные в файл yaml:
# config/acme.yml
development:
:api_user: 'joe'
:api_pass: 's4cret'
:timeout: 20
Создайте инициализатор для их загрузки:
# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme
Rails.application.configure do
config.acme = ActiveSupport::OrderedOptions.new
config.acme.api_user = acme_config[:api_user]
config.acme.api_pass = acme_config[:api_pass]
config.acme.timeout = acme_config[:timeout]
end
Теперь в любом месте приложения вы можете получить доступ к следующим значениям:
Rails.configuration.acme.api_user
Удобно, что Rails.application.config_for :acme
загрузит ваш acme.yml
и использует правильную среду.
Так как Rails 4.2 без дополнительных драгоценных камней вы можете загрузить config/hi.yml, просто используя Rails.application.config_for :hi
.
Например:
touch config/passwords.yml
#config/passwords.yml
development:
username: 'a'
password: 'b'
production:
username: 'aa'
password: 'bb'
touch config/initializers/constants.rb
#config/initializers/constants.rb
AUTHENTICATION = Rails.application.config_for :passwords
и теперь вы можете использовать константу AUTHENICATION
всюду в своем приложении:
#rails c production
:001> AUTHENTICATION['username'] => 'aa'
затем добавьте passwords.yml в .gitignore: echo /config/passwords.yml >> .gitignore
, создайте файл примера для вашего комфорта cp /config/passwords.yml /config/passwords.example.yml
, а затем просто отредактируйте файл примера в вашей рабочей консоли с фактическими производственными значениями.
Я просто хотел обновить это для последних интересных вещей в Rails 4.2, теперь вы можете сделать это в любом из ваших файлов config/**/*.rb
:
config.x.whatever.you.want = 42
... и это будет доступно в вашем приложении как:
Rails.configuration.x.whatever.you.want
Подробнее здесь: http://guides.rubyonrails.org/configuring.html#custom-configuration
Отметьте этот аккуратный камень, который делает именно это: https://github.com/mislav/choices
Таким образом, ваши конфиденциальные данные не будут отображаться в проектах с открытым исходным кодом.
Если вы используете Heroku или иным образом должны сохранять свои настройки приложения в качестве переменных среды, figaro драгоценный камень очень полезен.
Мне очень нравится settingslogic gem. Очень легко настроить и использовать.
Я создал простой плагин для настроек YAML: Yettings
Он работает аналогично коду в ответе khelll, но вам нужно только добавить этот файл конфигурации YAML:
app/config/yetting.yml
Плагин динамически создает класс, который позволяет вам получить доступ к настройкам YML в качестве методов класса в вашем приложении, например:
Yetting.your_setting
Кроме того, если вы хотите использовать несколько файлов настроек с уникальными именами, вы можете поместить их в подкаталог внутри app/config следующим образом:
app/config/yettings/first.yml
app/config/yettings/second.yml
Затем вы можете получить доступ к следующим значениям:
FirstYetting.your_setting
SecondYetting.your_setting
Он также предоставляет вам настройки по умолчанию, которые можно переопределить для каждой среды. Вы также можете использовать erb внутри файла yml.
Мне нравится использовать rails-settings для глобальных значений конфигурации, которые необходимо изменить с помощью веб-интерфейса.
Я хотел бы предложить хороший подход, как вообще иметь дело с конфигурацией в вашем приложении. Существует три основных правила:
Чтобы получить более подробный обзор, перейдите по этой ссылке: Правильно отредактируйте конфигурацию