Forum: Italian Ruby user group Evitare che ruby faccia l'escape del codice javascript

Posted by Sam Pei (sampei)
on 2012-11-14 18:31
Salve a tutti.

Il mio problema e' questo.

Nella mia vista ho messo:

<%= text_field_tag('name','',:onfocus => "for (var i=1;i<99999;i++){};"
%>

E mi sarei aspettato di trovare nella pagina html questo utput:

 <input  name="name" onfocus="for (var i=1;i<99999;i++){};" />

invece ruby mi produce questo:

<input  name="name" onfocus="for (var i=1;i&lt;99999;i++){};" />

E ovviamente il codice javascript non funziona...

Ho anche provato ad usare il metodo html_safe:
<%= text_field_tag('name','',:onfocus => "for (var
i=1;i<99999;i++){};".html_safe %>

ma non cambia niente, continua a sostituirmi il segno di minore con &lt;

Qualche idea?

Grazie a tutti

PS: rails 2.3.8 ruby 1.9.2
Posted by Matteo Latini (Guest)
on 2012-11-14 18:35
(Received via mailing list)
Devi usare escape_javascript()

http://api.rubyonrails.org/classes/ActionView/Help...

Da rails 3 in poi c'e' anche un alias j() non presente nella versione di 
rails che stai usando.

--
Matteo Latini
http://nebulab.it/

Il giorno 14/nov/2012, alle ore 18:31, Sam Pei <tex---74@libero.it> ha 
scritto:
Posted by Sam Pei (sampei)
on 2012-11-14 18:51
Matteo Latini wrote in post #1084445:
> Devi usare escape_javascript()
>
>
http://api.rubyonrails.org/classes/ActionView/Help...

Mi dispiace, ma non funziona.

Il risultato e' sempre uguale...

Grazie lo stesso!
Posted by Sergio Berisso (Guest)
on 2012-11-14 20:01
(Received via mailing list)
2012/11/14 Sam Pei <tex---74@libero.it>

> Matteo Latini wrote in post #1084445:
> > Devi usare escape_javascript()
> >
>
> 
http://api.rubyonrails.org/classes/ActionView/Help...
>
> Mi dispiace, ma non funziona.
>
> Il risultato e' sempre uguale...
>

mmhhh
Il consiglio di Matteo mi sembra ottimo

Cos non funziona ?

<%= text_field_tag('name','',:onfocus => escape_javascript("for (var
i=1;i<99999;i++){};") ) %>

S.
Posted by Sam Pei (sampei)
on 2012-11-15 12:45
Sergio Berisso wrote in post #1084464:
> Cos non funziona ?
>
> <%= text_field_tag('name','',:onfocus => escape_javascript("for (var
> i=1;i<99999;i++){};") ) %>

Si esatto, non funziona. Ma mi sta incuriosendo, perche' a voi funziona?

Cmq ho risolto il problema, grazie alla risposta che mi hanno dato sulla
sezione internazionale del forum
(http://www.ruby-forum.com/topic/4407873)

In pratica pare che text_field_tag abbia escape a true per default e
quindi fa sempre l'escape.

La soluzione e' di usare direttamente tag invece di text_field_tag, ed
in effetti cosi funziona.

Pero' una volta capito qual era il problema invece di cambiare tutti i
miei text_field_tag ho preferito fare un javascript del tipo

getElementById("name").onfocus = function (){for (var > 
i=1;i<99999;i++){};}

non andando proprio a scpecificare :onfocus di text_field_tag.

Poichè a questo punto il codice javascript sta in un javascript_tag e
non in un text_field_tag il problema e' risolto.
Posted by Luca P. (luca_p)
on 2012-11-15 13:26
(Received via mailing list)
So che non  on topic, ma ti consiglierei di fare l'attach degli eventi 
solo da JS, senza niente nel markup.
 pi pulito, pi facile da gestire, e non fai escape del JS :-)

Inviato da iPhone

Il giorno 15/nov/2012, alle ore 12:45, Sam Pei <tex---74@libero.it> ha 
scritto:
Posted by Sergio Berisso (Guest)
on 2012-11-15 15:36
(Received via mailing list)
2012/11/15 Sam Pei <tex---74@libero.it>

> Si esatto, non funziona. Ma mi sta incuriosendo, perche' a voi funziona?
>

Francamente non ho provato (nemmeno su rails 3)
E mi capita raramente di dover mettere inline JS (per fortuna :)

Cmq ho risolto il problema, grazie alla risposta che mi hanno dato sulla
> sezione internazionale del forum
> (http://www.ruby-forum.com/topic/4407873)
>
> In pratica pare che text_field_tag abbia escape a true per default e
> quindi fa sempre l'escape.
>
> La soluzione e' di usare direttamente tag invece di text_field_tag, ed
> in effetti cosi funziona.
>

def text_field_tag(name, value = nil, options = {})
   tag :input, { "type" => "text", "name" => name, "id" =>
sanitize_to_id(name), "value" => value }
       .update(options.stringify_keys)
end

Chiama tag (se non sbaglio)
Peccato non si possa passare un :escape => false

S.
Posted by Sergio Berisso (Guest)
on 2012-11-15 15:46
(Received via mailing list)
Il giorno 15 novembre 2012 13:14, Luca Pradovera
<luca.pradovera@gmail.com>ha scritto:

> So che non  on topic, ma ti consiglierei di fare l'attach degli eventi
> solo da JS, senza niente nel markup.
>  pi pulito, pi facile da gestire, e non fai escape del JS :-)
>

Vedi 3d su http://www.ruby-forum.com/topic/4407873 :)

Risposta di Sam Pei:

>> P.S: Do not use inline JS
>
> You're right, but my problem is that I have ruby code in rhtml that
> generates css and javascript codes. These codes are not static but
> depend on ruby variables values.
>
> I can't figure out how to pass a ruby variable into an external css or js
file...
>
> So I have to keep all the code in one big (sigh!) rhtml...

Forse quel codice avrebbe bisogno di (tanto) refactoring.
Se il progetto lo permettesse :)

S.
Posted by Sam Pei (sampei)
on 2012-11-15 17:08
Sergio Berisso wrote in post #1084574:
[cut]
>> I can't figure out how to pass a ruby variable into an external css or js
> file...
>>
>> So I have to keep all the code in one big (sigh!) rhtml...
>
> Forse quel codice avrebbe bisogno di (tanto) refactoring.
> Se il progetto lo permettesse :)

In effetti lo sto facenddo proprio ora.

Praticamente sto riscrivendo il codice javascript facendo tante funzioni 
che accettano degli argomenti.

Quando devo chiamare da rhtml se per esempio devo chiamare

funzioneJava(Argomento)

faccio

<%= javascript_tag "funzioneJava(" + variabileRuby + ") %>

il che fa veramente schifo, ma penso che sia il massimo che si possa 
fare

In tal modo le variabili ruby diventano variabili java e io posso 
spostare tutto il resto del codice java nel file .js

Ma, almeno quella linea, resta nel file rhtml. E ce ne deve stare una 
per ogni funzione...
Posted by Sante Rotondi (Guest)
on 2012-11-15 17:15
(Received via mailing list)
Sam Pei, scusa un secondo

Hai particolari vincoli che ti impediscano di usare html5 e i data-*
attributes?

Eviti questo orribile crimine contro l'umanit che  il javascript
mischiato all'html e ne guadagni in flessibilit e manutenibilit


2012/11/15 Sam Pei <tex---74@libero.it>
Posted by Andrea Pavoni (apeacox)
on 2012-11-15 17:21
(Received via mailing list)
Il giorno 15/nov/2012, alle ore 17:08, Sam Pei <tex---74@libero.it> ha 
scritto:
> <%= javascript_tag "funzioneJava(" + variabileRuby + ") %>
>
> il che fa veramente schifo, ma penso che sia il massimo che si possa
> fare

se la variabileRuby  servita con la richiesta di una pagina, puoi anche 
pensare di inserirla in un attributo data-qualcosa in qualche tag :P

HTML:
<div id="qualcosa" data-rubyvar='<% ruby_var %>'

JS:
var js_var = $('div#qualcosa').data('rubyvar')

se sono richieste AJAX, non hai bisogno di rjs, rispondi con json e 
prendi i dati della risposta

> In tal modo le variabili ruby diventano variabili java e io posso
> spostare tutto il resto del codice java nel file .js

lo scopo  chiaro, ma come vedi ci sono modi pi puliti per farlo. un buon 
link per approfondire unobtrusive JS:

http://www.simonecarletti.com/blog/2010/06/unobtru...

ciao,
A.

--
http://andreapavoni.com
Posted by Sergio Berisso (Guest)
on 2012-11-15 17:58
(Received via mailing list)
Il giorno 15 novembre 2012 17:21, Andrea Pavoni <apeacox@gmail.com> ha
scritto:

> > In tal modo le variabili ruby diventano variabili java e io posso
> > spostare tutto il resto del codice java nel file .js
>
> lo scopo  chiaro, ma come vedi ci sono modi pi puliti per farlo. un buon
> link per approfondire unobtrusive JS:
>
>
> http://www.simonecarletti.com/blog/2010/06/unobtru...


Sam Pei dovresti riuscire (penso, non ho provato :) ad applicare queste
tecniche anche in rails 2
http://andrewcox.org/post/507032751/rails-3-0-unob...

Ed una volta che hai tutto il codice js isolato, volendo

http://cjohansen.no/en/tdd/test_driven_development...
http://cjohansen.no/en/tdd/test_driven_development...

http://cjohansen.no/en/tdd
http://tddjs.com/
http://cjohansen.no/en/javascript/test_driven_java...

:-)

S.
Posted by Sam Pei (sampei)
on 2012-11-15 20:31
Andrea Pavoni wrote in post #1084590:
> se la variabileRuby  servita con la richiesta di una pagina, puoi anche
> pensare di inserirla in un attributo data-qualcosa in qualche tag :P
>
> HTML:
> <div id="qualcosa" data-rubyvar='<% ruby_var %>'
>
> JS:
> var js_var = $('div#qualcosa').data('rubyvar')

Alla fine sto facendo cosi, anche se il tuo esempio non ha funzionato.
Ho dovuto fare

HTML:
<div id="qualcosa" data-rubyvar='<%= ruby_var %>'>

JS:
 var div=document.getElementById('qualcosa');
 var js_var = div.getAttribute("data-rubyvar");

Cmq penso che utilizzando questa tecnica alla fine avro' tolto tutto il
codice javascript da rhtml.

A questo punto, scusate, visto che ci siamo, ma non e' che potrei fare
qualche giochetto del genere anche con CSS?

Infatti attualmente anche lo stile e' definito da delle variabili ruby e
poiche' utilizzo inline l'attributo :style => posso ovviamente mandare
queste variabili ruby allo stile.

Ma volendo fare un file .css a parte come sto facendo con javascript,
come accedo da questo file .css alle variabili ruby?

Grazie a tutti per il vostro prezioso aiuto.
Posted by Andrea Pavoni (apeacox)
on 2012-11-16 10:30
(Received via mailing list)
Il giorno 15/nov/2012, alle ore 20:31, Sam Pei <tex---74@libero.it> ha 
scritto:

> Alla fine sto facendo cosi, anche se il tuo esempio non ha funzionato.
> Ho dovuto fare
>
> HTML:
> <div id="qualcosa" data-rubyvar='<%= ruby_var %>'>
>
> JS:
> var div=document.getElementById('qualcosa');
> var js_var = div.getAttribute("data-rubyvar");

argh!  vero, ho usato jquery per selezionare l'elemento, oltre ad aver 
dimenticato il "=" nei tag di erb (<%%>) :P

l'importante  che hai risolto in modo pulito ;-)

> A questo punto, scusate, visto che ci siamo, ma non e' che potrei fare
> qualche giochetto del genere anche con CSS?
>
> Infatti attualmente anche lo stile e' definito da delle variabili ruby e
> poiche' utilizzo inline l'attributo :style => posso ovviamente mandare
> quete variabili ruby allo stile.

sicuro di averne bisogno? con un po' di pulizia puoi avere un CSS 
statico, costituito da classi/id, evitando gli stili inline e variabili 
ruby

ciao,
A.

--
http://andreapavoni.com
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.