代码之家  ›  专栏  ›  技术社区  ›  Andrew

Ruby液体模板引擎中的模量(或缺少)

  •  21
  • Andrew  · 技术社区  · 15 年前

    我在一个jekyll站点上工作,并尝试输出嵌套在row div中的三列div。 Liquid 让他们的 cycle 过滤器:

    {% for p in site.categories.post %}
        {% cycle 'add rows': '<div class="row">', nil, nil %}
            <div class="column">
                <a href="{{ p.url }}">{{ p.title }}</a>
            </div>
        {% cycle 'close rows': nil, nil, '</div>' %}
    {% endfor %}
    

    但是,只有当有3、6、9等帖子时,这才真正起作用。如果帖子总数不是三的倍数,那么 <div class="row"> 从不关闭--for循环在结束标记可以作为 close rows 周期。

    在Ruby、PHP或任何其他语言中,我都可以使用modular操作符轻松地修复这个问题,因此除了 闭行 循环I将输出 </div> 什么时候? if site.categories.size % 3 == 0 . 然而,Liquid,因为它是一种安全的模板语言,不支持模数。

    我还能做些什么来适当关闭 <DIV class=“row”> 当帖子总数不是三的倍数时?

    7 回复  |  直到 7 年前
        1
  •  14
  •   Grant Husbands    14 年前

    对于您的特定示例,可以使用 {% cycle 'close rows': nil, '</div>', '</div>' %} 之后 {% endfor %} .

        2
  •  13
  •   Dehli    10 年前

    我发现这样做很好!

    {% assign mod = forloop.index0 | modulo:4 %}
    {% if mod == 0 %}
       <!-- Do stuff -->
    {% endif %}
    
        3
  •  9
  •   Rytis LukoÅ¡evičius    14 年前

    目前唯一的方法是写一个液体过滤器来完成这个任务。在代码中适当的地方注册过滤器(如果与Rails一起使用或不使用Rails,则在不同的地方)。

    液体::模板。注册过滤器(液体过滤器)

    在您的projects/lib目录中,添加liquid_filters.rb:

    module LiquidFilters  
      # makes modulus operation available to templates
      def mod(data, param)
        data % param
      end  
    end
    

    之后,您可以像在模板中那样使用它: 变量mod:5

    如果您需要将它用于某种逻辑,您可以捕获该值。

    {% capture modulus %}{{ variable | mod:5 }}{% endcapture %}
    

    只是我注意到捕获的值是一个字符串,所以为了比较它

    {% if modulus == "0" %}
     ..
    {% endif %}
    
        4
  •  4
  •   G.M.L    13 年前

    我在for循环中使用了另一个技巧:在您的情况下是无用的,如果您只是想要一个模块来查明您的行是否已经结束,并且像我一样需要一个新行,则非常有用。

    在这个例子中,我将使用一行4项:

    {% assign currentRow = 1 %}
    # enter the for loop ... then, with 4 as the divisor:
    {% if forloop.index == 4 * currentRow %}
      # do whatever you want
      {% assign currentRow = currentRow + 1 %}
    {% endif %}
    # exit the for loop
    

    不是很好,但很容易。

        5
  •  4
  •   Naomi    9 年前

    我意识到这个问题已经为asker解决了,但是我最近在Liquid中遇到了这种情况,我想我会提供我的解决方案,以防它帮助具有类似标记要求的人。

    在我的例子中,我已经传递了一个if语句来验证是否至少有一个post,所以我在循环之外创建了第一个“row”div。我也会在for循环之后关闭它。这样可以防止出现少于三个岗位的情况。

    <div class="row">
    
        {% for p in posts %}
            <div class="column">
                <!-- Post code here -->
            </div>
            {% unless forloop.last %}
                {% cycle '', '', '</div><div class="row">' %}
            {% endunless %}
        {% endfor %}
    
    </div>
    

    每发布三次,循环将关闭当前行并打开一个新行。 unless 这是前环中的最后一个帖子,在这种情况下,我们不想打开新的一行,让包装 </div> 把它关起来。

        6
  •  3
  •   ThisClark Carlos Diamantino    9 年前

    我从这篇文章中学到了很多,这是我在整个项目中使用的三种模式。它与引导程序一起工作也很好。只需在下面的代码中更改column类。与列不同,相同的模式可以应用于其他模块有用的场景,例如奇数行和偶数行。希望它能帮助别人-

    四栏:

    <div class="container">
        {% for post in site.posts %}
            {% cycle 'add row' : '<div class="row">', nil, nil, nil %}
                <div class="column">
                    <!-- liquid tags here -->
                </div>
            {% cycle 'end row' : nil, nil, nil, '</div>' %}
        {% endfor %}
        {% cycle 'end row' : nil, '</div>', '</div>', '</div>' %}
    </div>
    

    三栏:

    <div class="container">
        {% for post in site.posts %}
            {% cycle 'add row' : '<div class="row">', nil, nil %}
                <div class="column">
                    <!-- liquid tags here -->
                </div>
            {% cycle 'end row' : nil, nil, '</div>' %}
        {% endfor %}
        {% cycle 'end row' : nil, '</div>', '</div>' %}
    </div>
    

    两列:

    <div class="container">
        {% for post in site.posts %}
            {% cycle 'add row' : '<div class="row">', nil %}
                <div class="column">
                    <!-- liquid tags here -->
                </div>
            {% cycle 'end row' : nil, '</div>' %}
        {% endfor %}
        {% cycle 'end row' : nil, '</div>' %}
    </div>
    
        7
  •  2
  •   bta    15 年前

    IIRC液体不会阻止模块操作,只有 % 性格。您可以在不使用 % 操作员。例如, 14.modulo(3) => 2 而不是 14 % 3 .