如何评估每个循环的内容

How to evaluate the contents of an each loop

设置如下:

我有一个装满 yaml 文件的数据文件夹,每个文件都包含关于 post 的元数据。在我的 .erb 模板中,我使用一个简单的 each.do 循环遍历所有这些。

现在,我想要做的不是打印该文件夹中的每个 yaml 文件,而是仅打印 .yaml 内容包含精确字符串的那些文件。

这可能吗?

-- 例如,假设我有这样的数据结构

-data
--blogposts
---post1.yaml
---post2.yaml
...
---post100.yaml

然后,对于每个 post#.yaml,为了简单起见,假设它看起来像这样:

---
:id: 1
:title: my example title
:postCategory:
  - :id: 1
    :categoryTitle:
      :Business

在我的模板中,抓取所有 post 的循环显然如下所示:

<% data.blogposts.each do |id, post| %>
    *display stuff*
<% end %>

我真正想要的是评估 "blogposts" 中的每个 .yaml 文件,检查是否有与字符串匹配的 categoryTitle 项(这里假设为 Business),如果有,则输出为循环中的项目。目标是我可以在每个 "category page" 上使用它并动态地拉入 post 正在请求的类别。

我会选择这样的东西:

  1. 收到 yaml 文件后检查并搜索 categoryTitle.
  2. 将文件名添加到 master.yaml 文件。
  3. 阅读master.yaml获取我要显示的所有文件的文件名。

这样您就不会每次都在所有文件中循环,您只需浏览一个文件以确定您真正需要打开的文件。

因此您的文件夹结构将多一个文件,例如:

-data
--master.yaml
--blogposts
---post1.yaml
---post2.yaml
...
---post100.yaml

master.yaml 文件结构可能如下所示:

:business:
  :post1.yaml
  :post3.yaml
:othertitle:
  :post2.yaml
  :post5.yaml

只需在 master.yaml 中检查具有您想要的标题的文件(例如 business)并仅循环遍历这些文件(而不是每次都循环所有文件)。

使用 Enumerable#grep,给定 category

<% data.blogposts.each do |id, post| %>
    if File.readlines("#{post.name}.yaml").grep(/#{category}/).size > 0
        *display stuff*
    end
<% end %>