2012-04-19 5 views
5

Considerate questo:Come emettere html_safe nel blocco <%=%> durante il concatenamento di stringhe?

<% 
str = "http://domain.com/?foo=1&bar=2" 
%> 

Ora questi casi:

<%=str%> 
# output:http://domain.com/?foo=1&amp;bar=2 

<%=str.html_safe%> 
# output:http://domain.com/?foo=1&bar=2 

<%="#{str.html_safe}"%> 
# output:http://domain.com/?foo=1&amp;bar=2 

<%=""+str.html_safe%> 
# output:http://domain.com/?foo=1&amp;bar=2 

ho bisogno per l'uscita del URL con altre stringhe. Come posso garantire che la e commerciale non venga ritratta? Per motivi indipendenti dalla mia volontà, non posso inviare &amp;.

Si prega di aiuto! Tirando i capelli qui: \

EDIT: Per chiarire, io in realtà sono una matrice in questo modo:

@images = [{:id=>"fooid",:url=>"http://domain.com/?foo=1&bar=2"},...] 

sto creando una matrice di JS (la image_array var) da utilizzare nella mia app questo modo :

image_array.push(<%[email protected]{|x|"{id:'#{x[:id]}',url:'#{x[:url].html_safe}'}"}.join(",")%>); 

Questo genera:

image_array.push({id:'fooid',url:'http://domain.com/?foo=1&amp;bar=2'},...); 

Che non funziona nel mio caso specifico. Ho bisogno dello url senza la parte amp;.

+0

è lì che le "ragioni indipendenti dalla mia volontà" parte viene a giocare ... io didn Non fare il ricevitore e non avere alcun controllo su questo ... ed è un'immagine 'src' ... no, non fa alcuna differenza – mga

+0

FWIW prova questo: http://images.nypl.org/index.php?id=g92f032_015zf&t=r vs http://images.nypl.org/index.php?id=g92f032_015zf & t = r – mga

+0

@phrogz aggiunto un chiarimento che potrebbe aiutare ... grazie – mga

risposta

7

quando si scrive:

"#{foo.bar}" 

questo è ~ equivale a scrivere

foo.bar.to_s 

Allora, cosa si sta effettivamente facendo è:

<%=str.html_safe.to_s%> 

... che Rails non vede più come essere al sicuro, e quindi colpisce la stringa risultante con un round di escape HTML.

non so la struttura interna di Rails, ma suppongo che il metodo html_safe estende l'oggetto stringa con una variabile di istanza segnalazione come OK, ma quando si avvolgono che in un'altra stringa tramite interpolazione si stanno ottenendo un nuovo stringa senza quella bandiera.

Modifica: per rispondere alle vostre esigenze, utilizzare raw oppure chiama html_safe sulla stringa finale:

<%=raw "foo#{str}"%> 
<%="foo#{str}".html_safe%> 

o nel tuo caso:

image_array.push(<%=raw @images.map{…}.join(',')%>); 
image_array.push(<%[email protected]{…}.join(',').html_safe%>); 

Vedi anche this question.

+0

ma come si genera una stringa 'html_safe' all'interno di una concatenazione? – mga

+0

@mga Vedi la mia modifica. – Phrogz

+0

SI! ... Ti amo, uomo – mga

2

Utilizzare questa

<%=str.html_safe.to_s%> 

o

<%=raw(str)%> 

vi darà risultati migliori

+0

come posso concatenarlo ad un'altra stringa all'interno dello stesso blocco '<%'? – mga

0
image_array.push(<%= @images.map{|x| "{id:'#{x[:id]}',url:'#{x[:url]}'}".html_safe }.join(",") %>); 
+0

No, una volta chiamato 'join', non nella matrice, verrà creata una nuova stringa che non è più contrassegnata come sicura. – Phrogz

+0

Sarei d'accordo, se non l'avessi testato personalmente su RoR 3.2. Risultato stampato nel registro e ha funzionato. Anche se mi chiedo se è il risultato desiderato, il & è correttamente senza caratteri di escape. – pduey

+0

Sorprendente. Toglierò il mio downvote. – Phrogz

Problemi correlati