Как запустить 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"}}
]
}
]
}];
Ответы
Ответ 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.