verschachtelte content_tags Escape inner html .. warum?

8

Also, wenn ich durchschlinge und eine Sammlung von li / a Tags erstelle, bekomme ich wie erwartet .. ein Array dieser Tags:

%Vor%

Ich rufe mich ihnen an und ich bekomme eine erwartete Zeichenfolge ...

%Vor%

Wenn ich diese Ebene jedoch tiefer in einem ol-Tag neste ...

%Vor%

Ich bekomme entflohenen inneren-html-Wahnsinn !!!

Wenn Sie sich den Quellcode der Schiene ansehen:

%Vor%

Es sieht täuschend so aus, als könnte ich es einfach machen: content_tag (: li, nil, nil, false) und nicht dem Inhalt entgehen lassen. Allerdings:

%Vor%

Ich leide immer noch unter dem unerwünschten html_escape-Syndrom ...

Der einzige Weg, um dies zu vermeiden, ist:

%Vor%

Aber .. Warum passiert das?

    
patrick 26.09.2011, 23:22
quelle

3 Antworten

15

Das passiert, weil in Rails 3 die SafeBuffer-Klasse eingeführt wurde, die die String-Klasse umschließt und die Standard-Escaping-Prozedur außer Kraft setzt, die sonst beim Aufruf von concat auftreten würde.

In Ihrem Fall gibt das content_tag (: li) einen korrekten SafeBuffer aus, aber Array # join versteht SafeBuffers nicht und gibt einfach einen String aus. Das content_tag (: ol) wird dann mit einem String als Wert anstelle eines SafeBuffers aufgerufen und entkommt. Es hat also nicht so sehr mit der Verschachtelung zu tun, als mit Join, die einen String und nicht einen SafeBuffer zurückgibt.

Das Aufrufen von html_safe in einem String, das Übergeben des Strings an "raw" oder das Übergeben des Arrays an safe_join gibt einen korrekten SafeBuffer zurück und verhindert, dass das äußere content_tag es löscht.

Im Fall der Übergabe von false an das Escape-Argument funktioniert dies nicht mehr, wenn Sie einen Block an das Inhalts-Tag übergeben, weil es capture(&block) ActionView :: Helpers :: CaptureHelper aufruft, mit dem die Vorlage abgerufen wird , oder Ihr Fall der Ausgabewert von Join, der dann html_escape in der Zeichenfolge aufruft, bevor es in die Methode content_tag_string gelangt.

%Vor%

Da value hier der Rückgabewert von join ist und join einen String zurückgibt, ruft er html_escape auf, bevor der content_tag-Code selbst mit seinem eigenen Escaping zu ihm gelangt.

Einige Referenzlinks für Interessierte

Ссылка

Ссылка

Ссылка

Ссылка

Bearbeiten

Eine andere Möglichkeit, dies zu umgehen, ist eine map / reduce statt map / join auszuführen, denn wenn reduce kein Argument übergeben wird, wird das erste Element verwendet und die angegebene Operation mit diesem Objekt ausgeführt, was im Falle von map content_tag gilt wird die Operation auf einem SafeBuffer aufrufen.

%Vor%

Als Einzeiler

%Vor%

Fügen Sie ein kleines Meta-Gewürz hinzu, um Dinge aufzuräumen

%Vor%

Wer braucht html_safe ... das ist Ruby!

    
Cluster 27.09.2011, 06:26
quelle
4

Was passiert, wenn Sie safe_join verwenden?

%Vor%

Oder einfach nur roh?

%Vor%     
Jordan Running 27.09.2011 00:40
quelle
0

Nicht positiv, aber ich denke, dass das html-Entweichen bei jeder "Schicht" passiert (aus Mangel an einem besseren Begriff; jede Iteration) - was ich meine, ist auf der inneren Block-Ebene (1..5) .... und dann auf der äußeren Block-Ebene (content_tag (: ol) do ...

)     
jschorr 26.09.2011 23:53
quelle