替换 YML 中的数组值

replace array values from YML

我有一个包含电子邮件列表的 YML 文件,我正在尝试对帮助文件进行一些更正,但我似乎无法更新并保留更新的信息

我需要根据配置文件发送的环境更改电子邮件。 我最大的问题是更新的信息没有保存在 file_data 数组

在生产以外的所有环境中,我希望所有电子邮件都有一个 开发电子邮件地址 ,但在生产中,我可以执行 eval() 从配置文件

示例 YML 文件

#config/brands_mailer.yml
brand1:
  support: 'Appname::Application.config.support_email'
  sales: 'Appname::Application.config.email'
  accounting: 'Appname::Application.config.accounting_email'
brand2:
  support: 'Appname::Application.config.barnd2_support_email'
  sales: 'Appname::Application.config.barnd2_email'
  accounting: 'Appname::Application.config.barnd2_accounting_email'
brand3:
  support: 'Appname::Application.config.barnd3_support_email'
  sales: 'Appname::Application.config.barnd3_email'
  accounting: 'Appname::Application.config.barnd3_accounting_email'

现在我有一个看起来像

的邮件助手
# app/helpers/mailers/mailr_helper.rb

module Mailers
  module MailrHelper
    def get_brand_emails(options ={})
      file_data = YAML.load_file(File.join(Rails.root, 'config','brands_mailer.yml'))[options[:brand].to_s]
      file_data.each do |fd|
        unless Rails.env.production? 
          fd[1] << 'moo@aol.com' # This appends to the current value 
          fd[1] = fd[1].gsub(fd[1], 'new@aol.com') # this changes the data but it does not persist 
         else
          fd[1] << eval(fd[1])  
         end
      end
      file_data
    end    
end

我强烈建议您在非生产环境的 rails 配置文件中使用邮件拦截器。有了它,您将能够在所有环境中使用和测试相同的邮件流程,而不必担心向实时收件人生成电子邮件。 Here 我已经描述了我倾向于如何为我的应用程序设置邮件拦截器。

这是我想到的解决方案。我仍然想重构并使其更清洁

app/helpers/mailers/mailr_helper.rb

module Mailers
  module MailrHelper
    def get_brand_emails(options ={})
      file_data = YAML.load_file(File.join(Rails.root, 'config','brands_mailer.yml'))[options[:brand].to_s]
      file_data.each do |fd|
        unless Rails.env.production? 
          file_data['customer_support'] = "dev@email.com"
          file_data['new_pro']          = "dev@email.com"
          file_data['new_user']          = "dev@email.com"
         else
          file_data['customer_support'] = eval(file_data['customer_support'])
          file_data['new_pro']          = eval(file_data['new_pro'])
          file_data['new_user']         = eval(file_data['new_user'])
         end
      end
      file_data
    end    
end

这样我仍然可以强制所有电子邮件到一个地方并且只转发生产中的电子邮件