Как запустить Ruby в HAML в определении JavaScript? - PullRequest
12 голосов
/ 03 мая 2011
  • как я могу запустить код ruby ​​внутри javascript в haml?
  • если я использую var = #{message} в моем примере, я получаю undefined local variable or method message
  • когда я двигаюсь - message = 'it works' выше :javascript все отлично работает

Я хочу запустить итерацию .each внутри :javascript. Смотрите последний пример кода для того, что мне нужно в конечном коде JavaScript. Где мне нужно зациклить несколько рубиновых переменных (или один хэш хешей?), Чтобы получить это. Данные (= 'основы') могут иметь несколько элементов. Это может иметь детей с несколькими элементами и т. Д.

ТАК этот хамл-код

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

        });
%body
    - message2 = 'hi'
    = message2
    %div{:id =>"jstree"}

дает мне этот 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>

Последний код javascript, который я хочу создать с использованием haml, - это переменная 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"}}
          ]

         }
        ]
      }];

Ответы [ 2 ]

29 голосов
/ 03 мая 2011

Сначала давайте рассмотрим то, что вы, кажется, знаете:

  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

Запуск приведенного выше кода дает следующий вывод:

<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>

Как видите, большой блок #{...} (который может занимать несколько строк) запускает произвольный код Ruby. Результат последнего выражения (в данном случае map{...}.join) преобразуется в строку и помещается в вывод.

2 голосов
/ 03 мая 2011

Документация haml для фильтров гласит, что вы можете интерполировать код Ruby, используя #{}

- flavor = "raspberry"
#content
  :textile
    I *really* prefer _#{h flavor}_ jam.
...