2012-09-20 11 views
42

Ich bin gerade auf einen Blog gestoßen, der eine j Funktion in Rails erwähnt. Sie benutzten es, um Ajax-Stil-Seiten-Updates zu machen.Was macht die j-Funktion in Rails?

$('#cart').html("<%=j render @cart %>"); 

ich sie partials werden mit dem cart teilweise, aber was ist der Punkt von j zu machen? Ich habe einige Artikel gefunden, die sagen, dass es die Zeichenfolge in etwas konvertiert, das JavaScript akzeptiert, aber was bedeutet das?

Antwort

51

escape_javascript(javascript)

Escapes Zeilenumbrüche und einfache und doppelte Anführungszeichen für die Segmente JavaScript.

Auch verfügbar über den Alias ​​j().

Von der the rails docs.

67

Peter hat tatsächlich die richtige Antwort gepostet. Aber ich werde versuchen, es auszuarbeiten:

Ich denke, dass Sie mit dem Grundkonzept von Ajax vertraut sind? Sagen wir, Sie möchten in der Lage sein, Kommentare in einer Ajaxy-Mode zu erstellen. In Schienen Sie POST Anfragen in Ihrem CommentsController über antworten kann:

def create 
    @comment = Comment.new(params[:comment]) 
    respond_to do |format| 
    render.js 
    end 
end 

Das bedeutet, wenn eine Ajax-Anforderung vom Client (über jquery/javascript) an die CommentsController vorgelegt wird, wird das Format erkennen (.js) und antworten Sie mit der _create.js.erb teilweise. Die partielle würde dann mit so etwas wie dies die neuen Kommentar machen:

$('.comments').append("<%=j render @comment %>"); 

Nun zum j oder escape_javascript Methode zu erhalten: Einige böse Nutzer einen Kommentar abgeben können (bösartige) JavaScript enthält, würde ausgeführt werden auf Ihrer Seite es sei denn Sie nutzen die j Methode machen die

Escapes Zeilenumbrüche und einfache und doppelte Anführungszeichen für JavaScript Segmente.

und verhindert daher die Ausführung des Codes im Browser.

+0

Beachten Sie, dass selbst wenn das, was Sie rendern, nicht vom Benutzer erstellt wird, Sie dennoch Zeichen vermeiden möchten, die nicht javascriptsicher sind, da Ihr JavaScript andernfalls möglicherweise beschädigt wird. – DaveMongoose