为什么不对变量进行算术运算

时间:2014-02-03 15:36:07

标签: ruby pagination jekyll liquid

我很难获得一个基本的if语句来处理jekyll网站的自定义分页。这是我的代码:

{% if paginator.total_pages > 1 %}
  {% for page in (1..paginator.total_pages) %}
    {% if page == paginator.page %}
      ({{ page }})
    {% elsif page >= 6 and page <= 10 %}
      {{ page }}
    {% else %}
      {{ paginator.page }}
    {% endif %}
  {% endfor %}
{% endif %}

假设当前页面是数字8,我得到以下输出:

8 8 8 8 8 6 7 (8) 9 10 8 8 8 8 8 8 8

现在,如果我用{% elsif page >= 6 and page <= 10 %}替换{% elsif page >= (paginator.page - 2) and page <= (paginator.page + 2) %},我会得到以下输出:

8 8 8 8 8 8 8 (8) 8 8 8 8 8 8 8 8 8

有人可以解释为什么基本算术不能对变量(paginator.page)起作用,以及我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

好的,完全重写我的回答,我会留下旧的东西,以便在历史记录中参考故障排除步骤。

根据这个:Liquid and Arithmetic Liquid拥有捕获变量和算术的方法。感谢OP的发现。只是惊讶于我在他们自己的文档中找不到这个。


好的,因为Liquid显然需要and,而不是&&我会尝试从if语句中获取算法。

{% for page in (1..paginator.total_pages) %}
{% assign two_less = (paginator.page - 2) %}
{% assign two_more = (paginator.page + 2) %}
{% if page == paginator.page %}
  ({{ page }})
{% elsif page >= two_less and page <= two_more %}
      {{ page }}
...

我认为您可能会看到Liquid模板语言出现问题。在Liquid中and之前就存在问题,即使在字符串中也是如此。请参阅此已结束的问题:https://github.com/Shopify/liquid/issues/13

我会试试这个:

{% elsif (page >= (paginator.page - 2)) && (page <= (paginator.page + 2)) %}

and&&在ruby中略有不同,可能Liquid对and有一些特殊意义。


旧回答

它基本上完全按照你的要求去做。你在评论中说“我知道价值是8,因为它打印了16次”。那是无效的调试。所有你知道的是

page = 8 #at the time of execution

并且您的if声明确定每次都需要打印该值。因此,您假设“{8”来自if语句的各个分支,但您的if语句更有可能继续评估打印“8”的分支。您可以在此处执行的最简单的调试是添加:

{% if paginator.total_pages > 1 %}
  {% for page in (1..paginator.total_pages) %}
    {% if page == paginator.page %}
      ({{ page }})
      {{ puts "if" }}
    {% elsif page >= (paginator.page - 2) and page <= (paginator.page + 2) %}
      {{ page }}
      {{ puts "else if" }}
    {% else %}
      {{ paginator.page }}
      {{ puts "else" }}
    {% endif %}
  {% endfor %}
{% endif %}

我不使用Jekyll所以我不是100%确定我的语法,但是你看到我想要实现的目标?这将告诉您输出值来自if语句的位置。如果它来自你怀疑的算术,它会告诉你。我怀疑的是,你会发现它永远不会像你假设的那样进入if的那一部分。另外,我不确定你为什么会这样做

8 8 8 8 8 6 7 (8) 9 10 8 8 8 8 8 8 8

您希望前五个和后七个元素评估为8而不是:

1 2 3 4 5 6 7 (8) 9 10 11 12 13 14 15 16 17

另外,只是为了确保你得到的变量返回类型,你希望改变

(paginator.page - 2) and page <= (paginator.page + 2)

为:

(paginator.page.to_i - 2) and page <= (paginator.page.to_i + 2)

所以我的回答几乎就是mcfinnigan所说的,算术与变量确实有效。所以你要么没有从方法paginator.page得到一个整数,要么在if语句的逻辑中有一些其他的缺陷。

修改 ----- (删除了关于“paginator.number”的部分,因为它似乎不适用于用户的情况)

如果您可以进行我建议的调试并发布输出,我可以扩展和改进这个答案。