【问题标题】:Rails config variables aren't found during initialization在初始化期间找不到 Rails 配置变量
【发布时间】:2012-05-22 05:54:54
【问题描述】:

我有一个文件 config/initializers/secrets.rb 包含以下内容:

Rails.configuration.smtp_domain = "derp.com"
Rails.configuration.smtp_password = "derpderp"
Rails.configuration.smtp_user = "derp@derp.com"
Rails.configuration.smtp_address = "derp.derp.com"

在我的 config/environments/development.rb 我有以下内容:

config.action_mailer.smtp_settings = {
    :address              => Rails.configuration.smtp_address,
    :port                 => 587,
    :domain               => Rails.configuration.smtp_domain,
    :user_name            => Rails.configuration.smtp_user,                           
    :password             => Rails.configuration.smtp_password,
    :authentication       => 'login',                                                 
    :enable_starttls_auto => true                                                     
}

现在当我bundle exec rails c 我得到这个错误:

`method_missing': undefined method `smtp_address' for #<Rails::Application::Configuration:0x007f8c4505b238> (NoMethodError)

但是,如果我将 smtp 配置注释掉,那么在控制台中我可以这样做:

Loading development environment (Rails 3.2.1)
irb(main):001:0> Rails.configuration.smtp_address
=> "derp.derp.com"

不过,我不能在生产中对此发表评论!任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 该文件路径真的是 config/initializers.secret.rb 而不是 config/initializers/secret.rb 吗?
  • 糟糕!那是一个错字,文件在正确的位置。谢谢!

标签: ruby-on-rails configuration initialization environment-variables


【解决方案1】:
  1. 在这里抛出一些东西,也许该文件在初始化程序目录中正确?
  2. 您能否更改您的Rails.configuration.... 内容并将其更改为常量。例如,SMTP_DOMAIN = 'derp.com' 等。

只是想知道这是否首先有效,然后您可以看到 wtf 正在处理 Rails.configuration.... 的东西。如果这是 TDD,我们会说,让我们把它变成绿色。我个人还没有看到 Rails.configuration 是这样使用的,但谁知道呢,也许它是一回事。

【讨论】:

  • 我喜欢你的 TDD 类比!不幸的是,这给了我uninitialized constant SMTP_ADDRESS (NameError) 这种Rails.configuration 样式适用于我使用when gem 将环境变量加载到我的schedule.rb 文件。不过,这些环境文件中有些不同之处,但对这种方法并不满意。
  • 好的,现在试试::SMTP_DOMAIN(或任何你叫它的名字),看看它是否有效。只是为了取笑我。
  • 我实际上从我之前的评论中得到了完全相同的错误。错误消息不显示双冒号,但我按照您的建议在 development.rb 文件中声明了它。感谢您的帮助!
  • 我同意 pjammer 的观点,即您应该像他所说的那样定义常量(我以前从未见过 Rails.configuration)。无论如何,我不确定这是否是您的问题的原因,但请注意 Rails 按字母顺序加载文件。因此,定义这些常量的文件的名称应该位于使用这些常量的文件之前。另外,这有点傻,但你永远不知道,每次更改初始化文件时不要忘记重新启动应用程序。
【解决方案2】:

从未见过这种情况,但如果我将require_relative 'initializers/secrets' 添加到我的environment.rb 的顶部,它会按我的预期工作。

这让我感到莫名其妙,因为这个在一个初始化器中,据我所知应该已经加载了。

如果有人能解释为什么我会很乐意接受你的答案而不是我自己的答案。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多