代码之家  ›  专栏  ›  技术社区  ›  Leszek Andrukanis

迁移Rails 6.0.34->6.1后,我无法在config/environments/development.rb中使用model

  •  0
  • Leszek Andrukanis  · 技术社区  · 4 年前

    我有Rails 6.1.0应用程序:

    config.action_mailer.smtp_settings[:password] = AppConfig::Mailchimp.api_key
    

    config/environments/development.rb

    module AppConfig
      class Mailchimp
        def self.api_key
         
          key = ENV['MAILCHIMP_API']
          # some additional processing here
          # ...
          key
        end
      end
    end
    

    app/models/app_config/mailchimp.rb

    当尝试运行开发控制台时,获取:

    /config/environments/development.rb:59:in `block in <top (required)>': uninitialized constant AppConfig (NameError)
    
    

    我在迁移6.0.3.4->6.1版本的Rails运行良好。 显然,他们在新版本中改变了加载方式,但我想知道:

    1. 有人知道这一变化的基本原理吗?Rails团队改变这一点的具体原因是什么,或者这不是故意的。

    2. 如何修复它,我至少有两个选择:

    0 回复  |  直到 4 年前
        1
  •  2
  •   cesartalves    4 年前

    加载环境后,使用初始化器设置邮件程序设置:

    # config/initializers/custom_smtp.rb
    
    ActionMailer::Base.smtp_settings.merge!({ password: AppConfig::Mailchimp.api_key })
    
        2
  •  2
  •   codenamev    4 年前

    Rails引入了新的 Zeitwerk autoloader 并且已经在Rails 6中慢慢被完全采用。如果你向下扫描到底部 Rails Configuration Guide ,如果你想保持旧的工作方式,你会看到有两种选择:

    config.load_defaults 6.0
    config.autoloader = :classic
    

    有了这些,你的原始代码应该可以继续工作。但是,从你给出的例子来看,我敦促你考虑使用 Rails credentials 。为此,请先运行:

    bin/rails credentials:edit
    

    为您的Mailchimp API密钥添加一个条目:

    mailchimp_api_key: abc1234
    

    当你需要引用它时,你只需:

    config.action_mailer.smtp_settings[:password] = Rails.application.credentials.mailchimp_api_key