0

應用程序配置,我想從數據庫中加載一些配置設置時,我的Rails(3.2.13)應用程序啓動:裝載軌從數據庫

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 

但現在看來,該數據庫的配置尚未閱讀在此刻。我收到一個錯誤:

ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished) 

我該如何做到這一點?要麼讓Rails首先初始化數據庫配置,要麼......還有其他的東西?

+0

您可能要暫停,並考慮使用,而不是從數據庫中值的環境變量。我一路走下坡路,非常喜歡環境變量。以這種方式設置的開發環境得到了dotenv gem的大力支持:https://github.com/bkeepers/dotenv – pdobb

+0

可能,但這更多的是CMS,我認爲配置全部可編輯,並且在一個位置可以簡化事情到最後。我會看看你的建議。謝謝。 –

回答

2

關於做法:因爲您的應用程序依賴於你的數據庫上滿的時候,其實它應該支持一個空數據庫做這樣的東西可能是有問題的。我能想到的兩個例子是當您嘗試從頭開始創建數據庫(例如rake db:setup)時,或者在測試環境中。但是,如果沒有其他選擇:我會將郵件程序初始化移動到您的system_setting.rb或初始值設定項(您保證有連接)。

配置/初始化/ 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 
} 
+0

在這種情況下,「系統設置」不是必需的。這些值最初可以爲空,並在稍後填寫。 正如你所說,我認爲在其他地方初始化是一個好主意。我會研究一下。謝謝! –

+0

您可以提供一個示例初始值設定項,並將其中的SMTP配置拉入到它中?我認爲它必須在我的應用程序類的上下文中,對嗎? –

+0

劃痕,我得到它的工作 - 將增加到您的答案。 –

0

手動連接並從數據庫加載值。

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 
+0

謝謝。這是一個壞主意嗎」? :) –