2017-05-05 64 views
-1

这里的内容是设置:如何来评估每个循环

我有充分的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 %> 

我真正想要的是评估“blogposts”中的每个.yaml文件,检查是否存在与字符串匹配的categoryTitle项目(比如Business here),如果是,则输出为循环中的项目。目标是我可以在每个“类别页面”上使用这个功能,并动态地吸引正在请求类别的帖子。

+0

你能提供YML文件也许2应包含1不应和范围仅限于所显示的数据将充分说明的简单例子问题? – engineersmnky

+0

那么,你将不得不循环(不知何故)通过每个文件,以确定哪些包含精确的字符串,所以你不会避免循环所有的文件。请分享您的代码示例,以便我们更好地理解您的问题。 – Gerry

+0

@engineersmnky - 增加了更好的描述,谢谢。 – Adam

回答

1

使用Enumerable#grep,对于给定category

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

谢谢 - 这让我获得了大部分途径。 '<%if file.readlines(“path/to/file /#{post.id} .yaml”)。grep(/#{category} $ /)。size> 0%> <% end %>' – Adam

0

我会像这样的东西去:

  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)并且仅循环这些文件(而不是每次循环所有文件)。