【问题标题】:How to get nested loops in config.rb to work in Middleman?如何让 config.rb 中的嵌套循环在 Middleman 中工作?
【发布时间】:2020-11-08 14:20:51
【问题描述】:

我们多年来一直致力于开发静态 HTML 网站构建器 Middleman。在最近的一次升级之后,我们遇到了一个让我们整个团队都陷入困境的问题。在 config.rb 中,所有 proxy 调用都可以正常工作,直到我们尝试运行这样的嵌套循环:

data.site.datatype.each do | id, c |
         puts c
      data.site.datatype.each do | id, c2 |
         puts c2
      end
    end

[注意 data.site.datatype 是使用 middleman-contentful 导入的 .yaml 文件。]

行为是外循环运行良好,但内循环拒绝执行。

外循环(puts c)的输出显示了 .yaml 有效负载的中间人导入,如下所示:

#<Middleman::Util::EnhancedHash id="id-1" name="comp1" slug="comp1">
#<Middleman::Util::EnhancedHash id="id-2" name="comp2" slug="comp2">

我们已经在这个问题上停留了一周,因此非常欢迎任何指导!

Gemfile如下:

source 'https://rubygems.org'
gem 'middleman', '~> 4.2'
gem 'middleman-autoprefixer', '~> 2.7'
gem 'tzinfo-data', platforms: [:mswin, :mingw, :jruby, :x64_mingw]
gem 'wdm', '~> 0.1', platforms: [:mswin, :mingw, :x64_mingw]
gem 'middleman-dotenv', '~> 2.0'
gem 'contentful_middleman', '~> 4.2.0'

否则 config.rm 有 activate :dotenvactivate :contentful

我们已返回https://middlemanapp.com/advanced/dynamic-pages/,但找不到任何有用的信息。

【问题讨论】:

  • 如果您使用的是现代 Ruby 版本,请使用带有binding.prybinding.irb 的调试器。把它放在puts c 之后,当你点击绑定时,尝试以交互方式评估它。
  • 感谢您的建议。是的,我可以在外部循环中包含 binding.irb,它返回与 puts 命令相同的信息。如果我将 binding.irb 放在内部循环中,则执行永远不会进入交互式会话,因此它不会产生任何额外的洞察力。即使以交互方式遍历脚本,内部循环也会被跳过。
  • 一位顾问建议用@app.data.site.datatype.each 替换data.site.datatype.each - 这似乎工作正常。我们仍在对该网站进行完整的测试,但到目前为止,上帝 - 这似乎已经解决了这个问题。
  • 如果您将binding.irb 放在puts c 之后,然后手动输入data.site.datatype.each do ... 会发生什么?

标签: ruby middleman contentful


【解决方案1】:

更新: 虽然我们还没有找到任何真正的文档,但这里是答案。
虽然 data.site 的使用在 .html.erb 模板中有效,但在 config.rb 中,对数据文件的调用需要 @app.data.site

所以上面的示例代码应该是这样的

@app.data.site.datatype.each do | id, c |
         puts c
      @app.data.site.datatype.each do | id, c2 |
         puts c2
      end
    end

提示来自 Middleman 回购:

https://github.com/middleman/middleman/blob/master/middleman-core/lib/middleman-core/core_extensions/data.rb#L15-L19

    # Make the internal `data_store` method available as `app.data`
    expose_to_application data: :data_store

    # Exposes `internal_data_store` to templates, to be wrapped by `data` in the context
    expose_to_template internal_data_store: :data_store

【讨论】:

  • 虽然此方法有效,但此修复或升级本身已导致 Middleman 的性能非常非常差。该网站有几千页,现在需要 20 小时以上才能生成静态网站。
猜你喜欢
  • 2022-06-25
  • 1970-01-01
  • 2017-05-13
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多