【问题标题】:After migration Rails 6.0.34 -> 6.1 I can't use model inside the config/environments/development.rb迁移 Rails 6.0.34 -> 6.1 后,我无法在 config/environments/development.rb 中使用模型
【发布时间】:2020-12-31 21:08:10
【问题描述】:

我有 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. 如何解决,我至少有两种选择:

【问题讨论】:

  • 首先,为什么models文件夹中有一个配置文件,为什么不将值作为ENV变量传递?你不应该对敏感数据进行硬编码。
  • 完全同意@cesartalves,更新了问题-它从 env 中获取值并使用该值进行一些处理。为了方便起见,我使用了硬编码值,但它确实是环境。关于保留它的模型,我对此没有影响。

标签: ruby-on-rails ruby


【解决方案1】:

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

# config/initializers/custom_smtp.rb

ActionMailer::Base.smtp_settings.merge!({ password: AppConfig::Mailchimp.api_key })

【讨论】:

  • 虽然没有解释原因,但它比在环境文件中明确要求要好得多。
【解决方案2】:

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

【讨论】:

  • 这个想法听起来很有趣,但在经典模式下检查后它发生的情况相同,所以一定是不同的原因。
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2014-11-28
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多