【问题标题】:YAML.load never returns in Rails initializerYAML.load 在 Rails 初始化程序中永远不会返回
【发布时间】:2012-03-10 21:36:16
【问题描述】:

我试图在我的 Rails 3.1 应用程序初始化期间加载一个 yaml 配置文件,并且对 YAML.load 的调用永远不会返回。这是我的初始化文件:

STRIPE_CONFIG = begin
  config = YAML.load(Rails.root.join('config', 'stripe.yml')) || {}
  config = config[Rails.env] || {}
  config.to_options
end

这是我的 stripe.yml 文件:

default: &default
  api_key:    test
  public_key: test

development:
  <<: *default

test:
  <<: *default

production:
  api_key:    prod
  public_key: prod

无论出于何种原因,YAML.load 调用永远不会返回。如果我执行堆栈跟踪,它似乎卡在 syck.rb 第 135 行。有趣的是,我让我的应用程序在中断前停留的时间越长,对第 135 行的调用就越多。

/Users/mhuggins/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/syck.rb:135:in `read'
/Users/mhuggins/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/syck.rb:135:in `read'
/Users/mhuggins/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/syck.rb:135:in `load'
/Users/mhuggins/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/syck.rb:135:in `load'
/Users/mhuggins/Sites/dating/config/initializers/stripe.rb:2:in `<top (required)>'
...

我也尝试过明确地使用 Psych 而不是使用 Syck,但没有运气。 (它最终也会挂起。)

STRIPE_CONFIG = begin
  require 'psych'
  config = Psych.load(Rails.root.join('config', 'stripe.yml')) || {}
  config = config[Rails.env] || {}
  config.to_options
end

【问题讨论】:

    标签: ruby-on-rails-3 yaml initializer syck psych


    【解决方案1】:

    呃,显然我只需要明确地读取文件。我改变了这个:

    YAML.load(Rails.root.join('config', 'stripe.yml'))
    

    到这里:

    YAML.load(File.open(Rails.root.join('config', 'stripe.yml')))
    

    【讨论】:

      【解决方案2】:

      答案会有点晚,但我刚刚偶然发现了类似的问题;)

      您可以使用YAML::load_file,它需要文件名作为参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多