从YML替换数组值

时间:2015-04-02 13:11:19

标签: ruby-on-rails arrays replace helper

我有一个带有电子邮件列表的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

2 个答案:

答案 0 :(得分:2)

我强烈建议您在rails配置文件中使用邮件拦截器来处理非生产环境。有了这些,您就可以在所有环境中使用和测试相同的邮件进程,而无需担心为实时收件人生成电子邮件。 Here我已经描述了我倾向于为我的应用设置邮件拦截器。

答案 1 :(得分:0)

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

的应用程序/助手/邮寄者/ 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

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