对于我的部署,我更喜欢在config/
下的YML文件中包含所有Rails配置选项。我对action_mailer.smtp_settings
有特殊问题。
我有一个文件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-settings中,结果如下:
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配置选项?
答案 0 :(得分: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 :(得分:2)
您可以使用config_for
:
Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp)
答案 2 :(得分:0)
Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp).symbolize_keys