Ответ 1
этот работает
%script
- 10.upto(20) do |i|
document.getElementById('aDiv').innerHTML += '#{i}';
Внутри HAML у нас есть петля внутри области: javascript?
Это будет работать:
- 10.upto(20) do |i|
:javascript
document.getElementById('aDiv').innerHTML += '#{i}';
и это не будет:
:javascript
- 10.upto(20) do |i|
document.getElementById('aDiv').innerHTML += '#{i}';
Можно ли также сделать код выше, чтобы работать?
этот работает
%script
- 10.upto(20) do |i|
document.getElementById('aDiv').innerHTML += '#{i}';
%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
) преобразуется в строку и помещается в выходной файл.
Изменить для Radek. Если вы хотите объявить переменную внутри шаблона Haml, внутри вашего JavaScript-фильтра (который кажется странным желанием), вы должны быть уверены, что результат блок to_s
не создает нежелательный вывод:
Этот Хам...
%p
:javascript
var foo = 12;
#{x = 42}
var bar = #{x};
... создает этот HTML-код:
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
42
var bar = 42;
//]]>
</script>
</p>
В то время как этот Haml...
%p
:javascript
var foo = 12;
#{x = 42; ""}
var bar = #{x};
... создает этот HTML...
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
var bar = 42;
//]]>
</script>
</p>
Но прежде чем вы это сделаете, спросите себя: почему я создаю сложные переменные Ruby на мой взгляд?
Не должна ли эта переменная быть объявлена моим контроллером?
Просто хотел добавить, что следующее получает вам тип и CDATA, но без фанкового поведения: javascript (мне просто нужно было реализовать что-то вроде этого).
%script{ :type => 'text/javascript' }
\//<![CDATA[
- (10..20) do |i|
document.getElementById('aDiv').innerHTML += '#{i}';
\//]]>