Ruby on rails 如何在YML文件中设置ActionMailer SMTP设置?
对于我的部署,我更喜欢在YML文件中的Ruby on rails 如何在YML文件中设置ActionMailer SMTP设置?,ruby-on-rails,configuration,actionmailer,Ruby On Rails,Configuration,Actionmailer,对于我的部署,我更喜欢在YML文件中的config/下设置所有Rails配置选项。我在操作\u mailer.smtp\u设置方面有特殊问题 我有一个文件,config/smtp.yml: development: address: localhost port: 1025 test: production: address: smtp.xs4all.nl port: 465 authentication: plain user_name: xxxxx passw
config/
下设置所有Rails配置选项。我在操作\u mailer.smtp\u设置方面有特殊问题
我有一个文件,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?
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
这将加载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\u mailer.smtp\u设置在这里为零?如何确保actionMailers配置选项已加载?深入挖掘,我发现问题在于bundle exec rake RAILS\u ENV=production RAILS\u GROUPS=assets assets:precompile“
只加载一小部分,而不是ActionMailer
在我的加载器中添加提前退出可以在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?
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_设置还不必定义和填充默认值。因此,使用空散列作为前缀解决了整个问题:
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
尽管有点难看,但它确实起到了作用。深入挖掘,我发现问题在于bundle exec rake RAILS\u ENV=production RAILS\u GROUPS=assets assets:precompile“
只加载一小部分,而不加载例如ActionMailer
在我的加载器中添加提前退出可以在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?
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_设置还不必定义并填充默认值。因此,用一个空散列预先填充它可以解决整个问题:
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
尽管有点难看,但它确实起到了作用。您可以使用:
Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp)
您可以为此使用:
Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp)
我认为“tls”不是smtp\u设置的有效字段,这可能是Portfolio::Application.config.action\u mailer.smtp\u设置[:tls]
返回零的原因。看一看是的,我在文档中没有看到它,但对我来说,它解决了我得到证书错误的问题。设置此选项,修复了我的错误。我认为“tls”不是smtp\u设置的有效字段,这可能是Portfolio::Application.config.action\u mailer.smtp\u settings[:tls]
返回零的原因。看一看是的,我在文档中没有看到它,但对我来说,它解决了我得到证书错误的问题。设置此设置,修复了我的错误。我几乎不建议添加。symbol\u keys方法公文包::Application.config.action\u mailer.smtp\u settings=config\u for(:smtp)。symbol\u keys我几乎不建议添加。symbol\u keys方法公文包::Application.config.action\u mailer.smtp\u settings=config\u for(:smtp)。symbol\u keys