如何评估每个循环的内容

时间:2017-05-05 17:43:27

标签: erb

以下是设置:

我有一个包含yaml文件的数据文件夹,每个文件都包含有关帖子的元数据。在我的.erb模板中,我通过一个简单的each.do循环遍历所有这些。

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

这可能吗?

- 例如,让我说我有这种数据结构

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

然后,对于每个帖子#.yaml,为了简单起见,让我们说它看起来像这样:

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

在我的模板中,抓住所有帖子的循环显然如下:

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

我真正想要的是评估&#34; blogposts&#34;中的每个.yaml文件,检查是否有与字符串匹配的categoryTitle项目(让我们说这里有Business),如果所以,输出作为循环中的项目。目标是我可以在每个&#34;类别页面上使用它&#34;并动态地拉入正在请求的类别的帖子。

2 个答案:

答案 0 :(得分:1)

对于给定的category

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

答案 1 :(得分:0)

我会选择这样的事情:

  1. 收到yaml文件后,检查categoryTitle
  2. 将文件名添加到master.yaml文件。
  3. 阅读master.yaml以获取我想要显示的所有文件的文件名。
  4. 这样,您不必每次都在所有文件中循环播放,只需通过一个文件来识别您真正需要打开的文件。

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

    -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),然后仅循环浏览这些文件(而不是每次都循环播放所有文件)。