Подтвердить что ты не робот

Как запустить ruby ​​в haml в определении javascript?

  • как я могу запустить ruby-код внутри javascript в haml?
  • Если я использую var = #{message} в своем примере, я получаю undefined local variable or method message
  • когда я перемещаюсь - message = 'it works' выше :javascript все работает отлично

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

SO этот код haml

%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"}}
          ]

         }
        ]
      }];
4b9b3361

Ответ 1

Во-первых, рассмотрите, что вы, похоже, знаете:

  • Ruby требует определения локальных переменных перед их использованием.
  • Вы можете запустить Ruby-код на линиях за пределами фильтра, используя - ....
  • Вы используете разметку #{...} для интерполяции кода 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

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

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