%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
Running powyższy kod daje to wyjście:
<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>
Jak widać, duża #{...}
blok (który może obejmować wiele linii) biegnie dowolnego kodu Ruby. Wynik ostatniego wyrażenia (w tym przypadku map{...}.join
) jest konwertowany na ciąg znaków i umieszczany na wyjściu.
Edycja dla Radka: Jeśli chcesz, aby zadeklarować zmienną wewnątrz ciebie haml szablonu wewnątrz filtra JavaScript (co wydaje się dziwne pragnienia), to trzeba mieć pewność, że wynik bloku to_s
robi” t powodować powstawanie wyjściowe:
Ten haml ...
%p
:javascript
var foo = 12;
#{x = 42}
var bar = #{x};
... produkuje to HTML:
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
42
var bar = 42;
//]]>
</script>
</p>
niniejsza haml ...
%p
:javascript
var foo = 12;
#{x = 42; ""}
var bar = #{x};
... produkuje ten kod HTML ...
<p>
<script type='text/javascript'>
//<![CDATA[
var foo = 12;
var bar = 42;
//]]>
</script>
</p>
Ale zanim to zrobisz, należy zadać sobie pytanie: dlaczego ja tworzenia złożonych zmiennych w moim Ruby widok?
Czy ta kontrolka nie powinna deklarować tej zmiennej?
działa. chociaż type = 'text/javascript' i CDATA brakuje, to nadal działa. –