Лучший способ организовать инициализаторы Rails - PullRequest
2 голосов
/ 14 октября 2011

в моем текущем проекте Rails я получил много инициализаторов, относящихся к среде, например, мой carrierwave.rb:

Для разработки я использую что-то вроде:

CarrierWave.configure do |config|
  config.cache_dir = Rails.root.join('tmp', 'carrierwave')
  config.storage = :file
end

Для производства я использую S3 до fog:

CarrierWave.configure do |config|
  config.cache_dir = Rails.root.join('tmp', 'carrierwave')
  config.storage = :fog

  config.fog_public  = false
  config.fog_credentials = {
    provider:              'AWS',
    aws_access_key_id:     '...',
    aws_secret_access_key: '...'  
  }
end

Я не хочу использовать много вызовов Rails.env.development? для переключения между конфигами, и я не хочу хранить эти инициализаторы в моих environment/*.rb файлах. Есть ли способ, например, создать каталог для каждой из моих сред в каталоге initializers?

initializers
├── development
│   └── carrierwave.rb
├── production
│   └── carrierwave.rb
└── test
    └── carrierwave.rb

Проблема в соответствии с руководствами Rails следующая:

Вы можете использовать подпапки для организации ваших инициализаторов, если хотите, потому что Rails просматривает всю файловую иерархию из папки инициализаторов и далее.

Ответы [ 4 ]

2 голосов
/ 31 марта 2014

Поместите инициализаторы для вашей среды под /config/environments/initializers/[env], например /config/environments/initializers/development и добавьте что-то вроде этого в config/application.rb:

module YourApp
  class Application < Rails::Application
    # Load environment specific initializers from "config/environments/initializers/[current_env]".
    initializer 'load_environment_initializers', after: :load_config_initializers do |app|
      Dir[File.join(File.dirname(__FILE__), 'environments', 'initializers', Rails.env.to_s, '**', '*.rb')].each {|file| require file }
    end

    ...

 end
end

Потребуется (загрузить) все файлы из /config/environments/initializers/[env] и его подкаталогов сразу после завершения загрузки всех обычных инициализаторов.

2 голосов
/ 14 октября 2011

Вам нужно перейти в другой каталог, все в папке инициализаторов будет включено во время загрузки.

Если вы поставите вышесказанное вместо того, чтобы сказать ..

rails_root / конфигурации / env_init_files / развитие

rails_root / конфигурации / env_init_files / производство

Тогда вы могли бы сделать что-то вроде этого ..

#at the end of your environment.rb        
Dir["#{Rails.root}/config/env_init_files/#{Rails.env}/**/*"].each { |initializer| require initializer }
0 голосов
/ 16 марта 2017

У меня есть рецепт Capistrano, который делает это.Учетные данные хранятся вне репозитория (в папке / var / secure /) и помещаются в конфигурационные / инициализаторы / при развертывании.

namespace :local do
  desc "Symlink all files in /var/secure into config/initializers.  This is how we get production keys into our apps without hard-coding them.  If they're production-only, great.  If there are development and production credentials, put the development credentials in the repo, and they will be overwritten during deploy."
  task :symlink_secure_initializers, :roles => [:app,:api] do
    run "for l in `ls /var/secure/*.rb`; do 
           rm -f #{release_path}/config/initializers/$(basename $l)
           ln -s /var/secure/$(basename $l) #{release_path}/config/initializers/$(basename $l)
         done"
  end
end

after "deploy:update_code", "local:symlink_secure_initializers"
0 голосов
/ 11 января 2014

Вы можете использовать гем dotenv и переменные окружения, чтобы изменить конфигурацию в environemnts.

...