组织Rails初始化程序的更好方法

时间:2011-10-14 07:07:55

标签: ruby-on-rails configuration initialization environment

在我目前的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 个答案:

答案 0 :(得分:2)

您必须进入另一个目录配对,初始化程序文件夹中的所有内容都将在启动时包含在内。

如果你把上面的内容改为说..

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 }

答案 1 :(得分:2)

将您的环境特定初始值设定项放在/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 :(得分:0)

您可以使用dotenv gem并使用环境变量来更改environemnts中的配置。

答案 3 :(得分:0)

我有Capistrano配方可以做到这一点。凭据存储在repo之外(在名为/ var / secure /的文件夹中),并在部署时符号链接到config / initializers /。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.bucky.youtubetest.MainActivity"
tools:showIn="@layout/app_bar_main">

<com.google.android.youtube.player.YouTubePlayerView
    class="com.google.android.youtube.player.YouTubePlayerView"
    id="@+id/view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:layout_editor_absoluteY="-6dp"
    tools:layout_editor_absoluteX="126dp" />