我正在尝试使用块设置来过滤块数组。我可以使用以下语法按“类型”之类的属性进行过滤:
{% assign example = section.blocks | where: "type", "photos" %}
我需要做的是按块设置过滤,如下所示:
{% assign example = section.blocks | where: settings.collection, collection.handle %}
上面的示例无声地失败。
注意事项:目前,我正在使用带有for循环和if语句的捕获来完成我所需要的,然后使用split进行赋值-但代码是如此肿,并且要做所有这些对于简单的过滤器操作来说似乎很可笑。我发现自己一直感觉自己在与液体作斗争,我想我希望它可能比我认为的要优雅。
答案 0 :(得分:2)
我对Ruby不太了解,但是您似乎can't将带有点标记的嵌套属性传递给where
过滤器。但是,在seeing people使用map
访问嵌套值之后,我测试了两者的混合,并且map filter在这种情况下似乎很好用。
我在块中有一个名为default
的布尔设置,并且使用以下命令将最后一个块的设置对象设为default
设置为true
:
{% assign obj = section.blocks | map: 'settings' | where: 'default' | last %}
当然,那么您不能在提取的设置对象之外获取数据。为此,我认为您确实需要遍历section.blocks
并使用if
标签手动查找过滤器。
答案 1 :(得分:0)
在我看来,这里的问题是,当您指示“ settings.collection”时,它并不引用“ photos”之类的值。
collection.handle应该是代码中类似于“ my-collection-handle”的字符串。同上,settings.collection应该用逗号书写。
也许您可以尝试类似的方法(未经测试):
{% assign example = section.blocks | where: 'settings.collection', 'handle-value' %}
答案 2 :(得分:0)
以前使用的 map
会丢失外部数据但发现字符串表示法适用于嵌套属性的 where
:
例如,使用 posts
集合,其中每个 .md
文件都具有前端内容:
header:
isArchived: true
以下 liquid
片段通过 header.isArchived
过滤已归档的帖子:
{% assign archived = site.posts | where: "header.isArchived", true %}
答案 3 :(得分:-1)
您做错了。 where
仅在根元素上起作用。在您的情况下,section.blocks
是根元素,因此where
可用于类似section.blocks.abcd_property
的事物。
粗略示例: {% assign example = section.blocks | where: 'collection', collection.handle %}
将加载所有具有 collection 属性的节块作为 collection.handle值
这将起作用
{% if settings.collection == collection.handle %}
{% assign example = section.blocks %}
{% else %}
{% assign example = '' | split: '' %}
{% endif %}