%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
L'esecuzione del codice di cui sopra dà questo output:
<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>
Come si può vedere, la grande #{...}
blocco (che può estendersi su più righe) viene eseguito codice Ruby arbitrario. Il risultato dell'ultima espressione (in questo caso lo map{...}.join
) viene convertito in una stringa e inserito nell'output.
Modifica per Radek: Se si vuole dichiarare una variabile dentro di te modello Haml, dentro il filtro JavaScript (che sembra un desiderio dispari), allora avete bisogno di essere sicuri che il risultato del blocco to_s
doesn' t produrre output indesiderati:
questa Haml ...
%p
:javascript
var foo = 12;
#{x = 42}
var bar = #{x};
... produce questo HTML:
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
42
var bar = 42;
//]]>
</script>
</p>
considerando che la presente Haml ...
%p
:javascript
var foo = 12;
#{x = 42; ""}
var bar = #{x};
... produce questo HTML ...
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
var bar = 42;
//]]>
</script>
</p>
Ma prima di fare questo, chiedetevi: perché sto creazione di variabili complesse Ruby in mia vista?
Questa variabile non dovrebbe essere stata dichiarata dal mio controller?
funziona. anche se type = 'text/javascript' e CDATA mancano, funziona ancora. –