对于我的部署,我更喜欢将所有Rails配置选项放在config/
下的YML文件中。我对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设置中,结果如下:
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}
但是当部署到生产环境时,这会导致一些冲突,可能是因为某些部分尚未引导。Capistrano失败:
* 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
nil在这里?如何确保actionMailers配置选项已加载?
4条答案
按热度按时间u0sqgete1#
深入挖掘,我发现问题是
bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"
只加载了一小部分,而不是例如。ActionMailer
。在我的加载器中添加一个早期退出修复了
config/initializers/smtp.rb
中的这个问题:然后,下一个问题是,在生产环境中设置了action_mailer,但smtp_settings不必定义和填充默认值。因此,用空哈希预填充这个问题解决了整个问题:
尽管如此,有点丑陋,但它确实起到了作用。
yvt65v4c2#
你可以使用
config_for
来实现:hvvq6cgz3#
c9x0cxw04#
如果您想按服务更像操作存储那样配置它,您可以这样做。
config/mailer.yml
app/lib/mail/gmail_smtp.rb
config/initializers/mailer.rb
app/mailers/user_mailer.rb