%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
Exécution du code ci-dessus donne cette sortie:
<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>
Comme vous pouvez le voir, le grand bloc #{...}
(qui peut couvrir plusieurs lignes) exécute le code arbitraire Ruby. Le résultat de la dernière expression (dans ce cas le map{...}.join
) est converti en une chaîne et placé dans la sortie.
Modifier pour Radek: Si vous voulez déclarer une variable à l'intérieur vous modèle Haml, dans votre filtre JavaScript (ce qui semble être un désir étrange), alors vous devez être sûr que le résultat du bloc to_s
n » t produire une sortie non désirée:
ce Haml ...
%p
:javascript
var foo = 12;
#{x = 42}
var bar = #{x};
... produit ce HTML:
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
42
var bar = 42;
//]]>
</script>
</p>
considérant que cette Haml ...
%p
:javascript
var foo = 12;
#{x = 42; ""}
var bar = #{x};
... ce produit HTML ...
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
var bar = 42;
//]]>
</script>
</p>
Mais avant de faire cela, demandez-vous: pourquoi suis-je en train de créer des variables complexes Ruby dans mon vue?
Cette variable n'aurait-elle pas dû être déclarée par mon contrôleur?
fonctionne. bien que type = 'text/javascript' et que CDATA soit manquant, cela fonctionne toujours. –