%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
den obigen Code Lauf gibt diese Ausgabe:
<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>
Wie Sie sehen können, der große #{...}
Block (die über mehrere Zeilen erstrecken kann) läuft beliebigen Code Rubin. Das Ergebnis des letzten Ausdrucks (in diesem Fall map{...}.join
) wird in einen String konvertiert und in die Ausgabe eingefügt.
Edit für Radek: Wenn Sie eine Variable innerhalb Sie Haml Vorlage, in Ihrem JavaScript-Filter erklären wollen (die wie eine seltsame Verlangen scheint), dann müssen Sie sicher sein, dass das Ergebnis des Blocks to_s
doesn‘ t produzieren unerwünschte Ausgabe:
Diese Haml ...
%p
:javascript
var foo = 12;
#{x = 42}
var bar = #{x};
... erzeugt HTML:
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
42
var bar = 42;
//]]>
</script>
</p>
Während dieser 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>
Aber bevor Sie dies tun, fragen Sie sich, produziert: warum erschaffe ich komplexe Ruby-Variablen in meinem Aussicht?
Sollte diese Variable nicht von meinem Controller deklariert worden sein?
funktioniert. obwohl type = 'text/javascript' und CDATA fehlen, funktioniert es trotzdem. –