Evitare che ruby faccia l'escape del codice javascript

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:

invece ruby mi produce questo:

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 <

Qualche idea?

Grazie a tutti

PS: rails 2.3.8 ruby 1.9.2

Devi usare escape_javascript()

http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript

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


Matteo L.

Il giorno 14/nov/2012, alle ore 18:31, Sam P. [email protected] ha
scritto:

Matteo L. wrote in post #1084445:

Devi usare escape_javascript()

http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript

Mi dispiace, ma non funziona.

Il risultato e’ sempre uguale…

Grazie lo stesso!

2012/11/14 Sam P. [email protected]

Matteo L. wrote in post #1084445:

Devi usare escape_javascript()

http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript

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.

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 :slight_smile:

Inviato da iPhone

Il giorno 15/nov/2012, alle ore 12:45, Sam P. [email protected] ha
scritto:

Sergio B. 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
(How to stop ruby escaping javascript? - Rails - Ruby-Forum)

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.

Il giorno 15 novembre 2012 13:14, Luca P.
[email protected]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 :slight_smile:

Vedi 3d su How to stop ruby escaping javascript? - Rails - Ruby-Forum :slight_smile:

Risposta di Sam P.:

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 :slight_smile:

S.

2012/11/15 Sam P. [email protected]

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 :slight_smile:

Cmq ho risolto il problema, grazie alla risposta che mi hanno dato sulla

sezione internazionale del forum
(How to stop ruby escaping javascript? - Rails - Ruby-Forum)

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.

Sam P., 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 P. [email protected]

Il giorno 15/nov/2012, alle ore 17:08, Sam P. [email protected] 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 :stuck_out_tongue:

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:

ciao,
A.


http://andreapavoni.com

Il giorno 15 novembre 2012 17:21, Andrea P. [email protected] 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:

Unobtrusive JavaScript in Rails 3 — Simone Carletti

Sam P. dovresti riuscire (penso, non ho provato :slight_smile: ad applicare queste
tecniche anche in rails 2
http://andrewcox.org/post/507032751/rails-3-0-unobtrusive-ajax-in-rails-2-3-x

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

http://cjohansen.no/en/tdd/test_driven_development_with_javascript
http://cjohansen.no/en/tdd/test_driven_development_with_javascript_part_two

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

:slight_smile:

S.

Sergio B. 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 :slight_smile:

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…

Andrea P. 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 :stuck_out_tongue:

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:

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.

Il giorno 15/nov/2012, alle ore 20:31, Sam P. [email protected] ha
scritto:

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

HTML:

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 (<%%>) :stuck_out_tongue:

l’importante che hai risolto in modo pulito :wink:

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