如何在javascript定义中运行haml in haml?

Rad*_*dek 12 ruby haml

  • 如何在haml中的javascript中运行ruby代码?
  • 如果我var = #{message}在我的例子中使用我得到undefined local variable or method message
  • 当我移动- message = 'it works'上述:javascript一切工作正常

我想在里面运行迭代 .请参阅最后一个代码示例,了解我在最终的javascript代码中需要什么.在哪里我需要循环一些ruby变量(或散列哈希的散列?)来获得这个.数据(='基础')可以有很少的元素.它可以有少数元素的孩子等..each:javascript

这个haml代码

%html
  %head
    :javascript
      $(document).ready(function() {
        - message = 'it works'
            var = message

        });
%body
    - message2 = 'hi'
    = message2
    %div{:id =>"jstree"}
Run Code Online (Sandbox Code Playgroud)

给了我这个HTML代码

<html>
  <head>
    <script type='text/javascript'>
      //<![CDATA[
        $(document).ready(function() {
            - message = 'hi'
            var = message

        });
      //]]>
    </script>
  </head>
  <body>
    hi
    <div id='jstree'></div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我想用haml生成的最终javascript代码是javascript变量

var data = [{
       data: "basics",
       attr: {},
        children: [
         {data: "login", attr: {run: "run"},
           children: [                   
           {data: "login", attr: {}}
          ]
         } ,
         {data: "Academic Year", attr: {run: "run"},
          children: [                   
           {data: "login", attr: {}},
           {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}}
          ]

         }
        ]
      }];
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 29

首先,让我们回顾一下您似乎知道的内容:

  1. Ruby要求您在使用它们之前定义局部变量.
  2. 您可以使用过滤器外部的行上运行Ruby代码- ....
  3. 您可以使用#{...}标记在过滤器中插入Ruby代码.

你说你想跑each,但可能你想要输出; 因为结果#{...}变成了一个字符串并放入你的代码中,你真正想要的(可能)是map:

%html
  %head
    :javascript
      var foo = [];
      #{
        limit = rand(4)+3
        array = (0..limit).to_a
        array.map{ |i| "foo[#{i}] = #{rand(12)};" }.join ' '
      }
      console.log(foo.length);
    %body
Run Code Online (Sandbox Code Playgroud)

运行上面的代码给出了这个输出:

<html>
  <head>
    <script type='text/javascript'>
      //<![CDATA[
        var foo = [];
        foo[0] = 2; foo[1] = 0; foo[2] = 11; foo[3] = 8; foo[4] = 0; foo[5] = 1;
      //]]>
    </script>
    <body></body>
  </head>
</html>
Run Code Online (Sandbox Code Playgroud)

如您所见,#{...}大块(可能跨越多行)运行任意Ruby代码.最后一个表达式(在本例中为map{...}.join)的结果将转换为字符串并放在输出中.