为什么特定环境不会覆盖rails中的environment.rb?

时间:2009-12-27 13:25:29

标签: ruby-on-rails email app-config

我正在尝试在其开发环境中处理Rails站点,我想在那里测试电子邮件传递,而我无法确定为什么在主environment.rb中声明的属性不会被覆盖通过我认为在启动rails应用程序时加载的更具体的development.rb文件。

我的理解是,更具体的环境配置文件中的值应该覆盖共享的'environment.rb'配置文件,所以如果我在config/environment.rb中声明了一些这样的电子邮件设置......

ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.hostingcompany.com',
  :port           => 25,
  :domain         => 'productiondomain.net',
  :authentication => :login,
  :user_name      => "productiondomainmailer",
  :password       => "TOP_SEKRIT"
}

...然后,下面config/environments/development.rb中的代码应覆盖ActionMailer:Base.smtp_settings哈希:

ActionMailer::Base.smtp_settings = {
  :domain         => 'developmentdomain.net'
}

但是,在开发环境中加载应用时,或者从script/console加载ActionMailer::Base.smtp_settings[:domain]时,它仍会列为'productiondomain.net'。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

要设置开发环境的配置:

config.action_mailer.smtp_settings =

而不是:

ActionMailer::Base.smtp_settings =

config / environments / development.rb

请注意,在 config / environments / development.rb 中,您需要指定完整的设置集,而不只是:domain,因为哈希值会覆盖现有值,而不是与之合并它

同样,通过将config.action_mailer.smtp_settings =放在Rails::Initializer.run do |config|块中,在 config / environments.rb 中设置默认值。

答案 1 :(得分:1)

这应该有效:

config.action_mailer.smtp_settings = {
  :address        => 'smtp.some_host.com',
  :port           => 25,
  :domain         => 'developmentdomain.net',
  :authentication => :login,
  :user_name      => 'blabla',
  :password       => "some_pass"  
}