【问题标题】:Nesting displayed when mapping collection in HAML在 HAML 中映射集合时显示的嵌套
【发布时间】:2015-09-21 16:18:07
【问题描述】:

我正在使用 HAML 开发 Rails 应用程序。当我偶然发现这种奇怪的行为时,我需要向用户展示一个列表:

显然,这段代码不会产生任何输出。

- 5.times.map do |n|
  - n + 1

此代码生成1 2 3 4 5,因为它正在输出内部语句的返回值。

- 5.times.map do |n|
  = n + 1                # Notice the =

此代码在输出映射数组时生成[1, 2, 3, 4, 5]

= 5.times.map do |n|     # Notice the =
  - n + 1

到目前为止,一切都很好......

此代码生成1 2 3 4 5 [0, 0, 0, 0, 0],因为它不喜欢人类。

= 5.times.map do |n|     # Notice the =
  = n + 1                # on both lines

此代码生成1 2 3 4 5 [1, 1, 1, 1, 1],因为它嵌套在<p> 中。

%p                       # Here we are nested one <p> deep
  = 5.times.map do |n|
    = n + 1

此代码生成1 2 3 4 5 [2, 2, 2, 2, 2],因为它是双重嵌套的(等等)。

%p                       # Here we are nested two <p> deep
  %p
    = 5.times.map do |n|
      = n + 1

有人对 HAML 内部发生的事情有解释吗? = n+1 是否都将字符串添加到某个输出缓冲区,然后返回它的嵌套级别?

【问题讨论】:

    标签: html ruby-on-rails dictionary nested haml


    【解决方案1】:

    实际上,您所问的是非常依赖于版本的。我的意思是它将在即将发布的 Haml 版本中产生不同的结果 (v4.1.0)。

    但首先让我们找出为什么在版本 4.1.0 中会出现这种输出?

    在底层,Haml 将模板转换为可执行的 Ruby 代码。这项工作在Haml::Compiler 类中完成,您可以轻松调试此代码:

    require 'haml'
    
    puts Haml::Engine.new(%q{
    %p
      %p
        %p
          = 5.times.map do |i|
          = i
    }).render # => produces the output
              # you have in last example
    

    了解相关的 Ruby 代码是什么样的。 经过一些简化,它看起来像这样:

    haml_temp =  5.times.map do |i|
      _hamlout.push_text("      #{_hamlout.format_script_false_false_false_false_false_true_false(( i ));}\n", 0, false);
    end
    

    您现在可以很容易地看到,您的值已映射到表达式:

    _hamlout.push_text(...)
    

    _hamlout 这里是Haml::Buffer 的一个实例,这是last line,它从push_text 方法返回值:

     @real_tabs += tab_change
    

    @real_tabs 是缩进级别。如果我们不使用缩进,那么它是0,当涉及一个%p时,它就变成1等等。 tab_change 参数是 0(参见调试代码)。

    因此,Haml 版本4.0.7 的输出等于嵌套级别。这正是您的输出的样子。

    但是在即将发布的版本4.1.0 中,这种行为可能会被“破坏”。比较当前主分支中的last line of the same method

    @buffer << text
    

    这将返回一些文本值。

    【讨论】:

    • 有趣。 commit which introduced this change 似乎来自 2013 年。
    • @bosticko rubygems.org/gems/haml 4.1.0.alpha 版本于 2013 年 11 月发布。我希望,我们最终会看到它的最终版本:)
    • 哇!那是很长一段时间。肯定地解释了那个时间戳。嗯...实际上可能没有那么长,但似乎很长。
    猜你喜欢
    • 2021-08-16
    • 2020-12-12
    • 1970-01-01
    • 2015-02-07
    • 2016-01-07
    • 2018-01-30
    • 2017-06-11
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多