Josh M.
Josh M.

Reputation: 27791

Load rails app config from database

I'd like to load some config settings from the database when my Rails (3.2.13) app starts:

class MyApp < Rails::Application
  #...normal config here...

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method       = :smtp
  config.action_mailer.smtp_settings         = {
    :address              => SystemSetting.system_smtp_host,
    :port                 => SystemSetting.system_smtp_port,
    :user_name            => SystemSetting.system_smtp_username,
    :password             => SystemSetting.system_smtp_password,
    :authentication       => SystemSetting.system_smtp_authentication,
    :enable_starttls_auto => SystemSetting.system_smtp_enable_starttls_auto }
end

But it appears that the database config has not been read at this point. I get an error:

ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished)

How can I accomplish this? Either make Rails initialize the database config first, or ... something else?

Upvotes: 1

Views: 1114

Answers (2)

Ronna
Ronna

Reputation: 1190

Regarding practices: Doing stuff like this can be problematic because your application relies on your database to be full when in fact it should support an empty database. Two examples that I can think of are when you try to create a database from scratch (e.g. rake db:setup), or in tests environments.

However, if have no other choice: I would move the mailer initialization to your system_setting.rb or an initializer (where you are guaranteed to have a connection).

config/initializers/load_system_settings.rb

MyApp::Application.config.action_mailer.raise_delivery_errors = true
MyApp::Application.config.action_mailer.delivery_method       = :smtp
MyApp::Application.config.action_mailer.smtp_settings         = {
  :address              => SystemSetting.system_smtp_host,
  :port                 => SystemSetting.system_smtp_port,
  :user_name            => SystemSetting.system_smtp_username,
  :password             => SystemSetting.system_smtp_password,
  :authentication       => SystemSetting.system_smtp_authentication,
  :enable_starttls_auto => SystemSetting.system_smtp_enable_starttls_auto
}

Upvotes: 2

Siva
Siva

Reputation: 8058

Manually connect and load values from database.

class Application < Rails::Application

  # Set your app path
  app_base = 'MY_APPLICATION_PATH' 

  # Load db configs
  db_yml = YAML.load_file("#{app_base}/config/database.yml")["production"]

  # Establish db connection
  ActiveRecord::Base.establish_connection(:adapter=>db_yml['adapter'], :database=>db_yml['database'], :username=>db_yml['username'], :password=>db_yml['password']) 

  # load model if not 
  require "#{app_base}/app/model/system_setting.rb" unless defined?('SystemSetting')

  #...normal config here...

  config.action_mailer.raise_delivery_errors           = true
  config.action_mailer.delivery_method                 = :smtp
  config.action_mailer.smtp_settings                   = {
    :address                                          => SystemSetting.system_smtp_host,
    :port                                             => SystemSetting.system_smtp_port,
    :user_name                                        => SystemSetting.system_smtp_username,
    :password                                         => SystemSetting.system_smtp_password,
    :authentication                                   => SystemSetting.system_smtp_authentication,
    :enable_starttls_auto                             => SystemSetting.system_smtp_enable_starttls_auto }

  #close sql connection after loaded 
   ActiveRecord::Base.connection.close
end

Upvotes: 0

Related Questions