Rails + Builder.Generate XML-Ausgabe ohne Entitäten

8

Wie man Builder dazu bringt, nicht 'śćż' und andere solche Zeichen zu codieren. Was ich will ist, dass "całość" buchstäblich im XML-Dokument gedruckt wird. Beispiel:

%Vor%

Ausgabe:

%Vor%

ca&#322;o&#347;&#263; sollte całość sein. Ich habe Pseudo-Lösung wie xml.RodzajPaczki {|t| t << 'całość' } gesehen, aber es funktioniert nicht richtig. Es "Całość" auf die linke Seite eines Dokuments outdent.

    
Casual Coder 27.07.2011, 14:01
quelle

4 Antworten

9

Hier ist was passiert. Wie wir wissen, wird Builder standardmäßig Nicht-ASCII-Zeichen wie in całość enthalten. Sie haben auch einen möglichen Weg erwähnt, um es zu beheben und das ist:

%Vor%

Wenn Sie einen Block an das Element RodzajPaczki übergeben, geht Builder davon aus, dass es ein inneres xml geben wird. Daher wird eine neue Zeile hinzugefügt und der Einzug angewendet. Natürlich gibt es in unserem Fall nur inneren Text und kein xml, so dass wir eine unansehnliche Ausgabe wie:

bekommen %Vor%

Es gibt einen einfachen Weg und einen härteren Weg, dies zu beheben. Zuerst der einfache Weg.

Konfigurieren Sie Indent so, dass er null ist

Dann können Sie das Update von oben verwenden xml.RodzajPaczki {|t| t << 'całość' } alles funktioniert wie erwartet, aber die Ausgabe wird nicht schön gedruckt, es wird tatsächlich alles in einer Zeile sein:

%Vor%

Sie können dies über einen externen hübschen Drucker ausführen, wenn Sie es schön formatiert haben möchten.

Wenn Sie einfach eine schön gedruckte Ausgabe benötigen und nicht flüchten wollen, müssen wir den Builder etwas patchern. Dies ist der schwierigere Weg, um dieses Problem zu beheben.

Patch-Builder

Wir müssen den Initialisierer unseres XmlMarkup -Objekts patchen, um eine zusätzliche Option :escape hinzuzufügen. Gleichzeitig patchen wir das Objekt XmlBase , um diese neue Option als Parameter zu verwenden. Wir setzen diese neue Option auf true , um das Standardverhalten beizubehalten. Dann patchen wir die text! -Methode auf XmlBase , um unsere neue Option zu verwenden, um zu entscheiden, ob wir Text von nicht entkommen sollen. So sieht es aus:

%Vor%

Wir können nun unseren neu gepatchten Builder auf die folgende Weise verwenden ( beachten, dass wir beim Erstellen des XmlMarkup -Objekts unsere neuen :escape -Optionen mit dem Wert false ):

%Vor%

Die Ausgabe ist wie folgt:

%Vor%

Wie gewünscht, wird der Text nicht maskiert. Beachten Sie, dass der Patch dieses nicht-flüchtige Verhalten auf den gesamten Text anwendet. Wenn Sie also nur einen Teil des Textes nicht maskieren möchten, während anderer Text weiterhin maskiert ist, müssen Sie den Builder in viel größerem Umfang patchern.

    
skorks 12.08.2011, 15:01
quelle
0

Ich kann das nicht mit meinem Setup replizieren. Welche Version von Ruby / Rails / Builder verwenden Sie?

    
sublimeike 27.07.2011 16:05
quelle
0

Ich kann "całość" ohne Probleme ausgeben (Ruby 1.9.2, Builder 3.0.0). Die Handbuchseite Ссылка schlägt vor, $KCODE auf 'UTF8' zu setzen (siehe ganz am Ende der Seite), aber ich denke, das ist für Ruby 1.8. Was ich in meiner Datei habe, ist etwas wie:

%Vor%     
Alexey 09.10.2011 12:54
quelle
0

Ein Kommentar in Rails Ticket # 1446 zeigt an, dass dies in Builder 3.0.0 behoben werden kann. Ich habe es aber selbst noch nicht ausprobiert.

    
fractious 12.09.2012 17:08
quelle