2013-12-18 83 views
1

对于我的部署,我更喜欢在config/下的YML文件中包含所有Rails配置选项。我遇到了action_mailer.smtp_settings的特殊问题。如何在YML文件中设置ActionMailer SMTP设置?

我有一个文件,config/smtp.yml

development: 
    address: localhost 
    port: 1025 

test: 

production: 
    address: smtp.xs4all.nl 
    port: 465 
    authentication: plain 
    user_name: xxxxx 
    password: xxxxx 
    tls: true 

然后我尝试通过初始化包括这些值。 config/initializers/smtp.rb

options = YAML.load_file(Rails.root.join('config', 'smtp.yml'))[Rails.env] 

options.each do |name, value| 
    Portfolio::Application.config.action_mailer.smtp_settings[name.to_sym] = value 
end unless options.nil? 

这会将smtp.yml文件,分析该返回的散列当前的环境中,例如

{"address"=>"smtp.xs4all.nl", "port"=>465, "authentication"=>"plain", "user_name"=>"xxxxx", "password"=>"xxxxx", "tls"=>true} 

键转换为符号,并补充说,到SMTP的设置,resuling在如:

irb(main):002:0> Portfolio::Application.config.action_mailer.smtp_settings 
    => {:port=>465, :address=>"smtp.xs4all.nl", :authentication=>"plain", :user_name=>"xxxxx", :password=>"xxxx", :tls=>true} 

但部署到生产的时候,这会导致一些冲突,可能是因为某些部分还没有开机了。卡皮斯特拉诺失败:

* executing "cd -- /var/www/ANT_cms/releases/20131218170336 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile" 
servers: ["li153-5.members.linode.com"] 
[li153-5.members.linode.com] executing command 
** [out :: li153-5.members.linode.com] rake aborted! 
** [out :: li153-5.members.linode.com] undefined method `[]=' for nil:NilClass 

为什么我的Portfolio::Application.config.action_mailer.smtp_settings为零?我如何确保actionMailers配置选项已被加载?

+1

,我不认为“TLS”是smtp_settings有效的领域,这可能是为什么'组合:: Application.config.action_mailer .smtp_settings [:tls]'返回nil。看看http://api.rubyonrails.org/classes/ActionMailer/Base.html – aruanoc

+0

是的,我没有在文档中看到它,但对我来说,它解决了我遇到证书错误的问题。设置这个,解决了我的错误。 – berkes

回答

4

深入挖掘,我发现问题是bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"只加载一个小子集,而没有加载。 ActionMailer

添加早早退出我的装载机修复了这个在config/initializers/smtp.rb

unless Portfolio::Application.config.action_mailer.nil? 

    options = YAML.load_file(Rails.root.join('config', 'smtp.yml'))[Rails.env] 

    options.each do |name, value| 
    Portfolio::Application.config.action_mailer.smtp_settings[name.to_sym] = value 
    end unless options.nil? 

end 

之后,下一个问题是在生产该action_mailer设置,但smtp_settings不必定义和填充默认值,然而。因此,用一个空的哈希预填此问题可解决整个问题:

unless Portfolio::Application.config.action_mailer.nil? 

    Portfolio::Application.config.action_mailer.smtp_settings = {} 

    options = YAML.load_file(Rails.root.join('config', 'smtp.yml'))[Rails.env] 

    options.each do |name, value| 
    Portfolio::Application.config.action_mailer.smtp_settings[name.to_sym] = value 
    end unless options.nil? 
end 

仍然有点难看,但它确实有效。

1

您可以使用config_for此:

Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp) 
+0

我几乎不推荐添加.symbolize_keys方法Portfolio :: Application.config.action_mailer.smtp_settings = config_for(:smtp).symbolize_keys – montells

0
Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp).symbolize_keys