Pytanie Unescaping string HTML


Mam odziedziczył następujący ciąg (nie mogę nic zrobić w sprawie formatu):

 <iframe \n  class=\"some_class\"\n  type=\"text/html\" \n  src=\"/embed/iframe_content.html?id=tsqA5D7_z10\" \n  width=\"960\" \n  height=\"593\" \n  marginwidth=\"0\" \n  marginheight=\"0\" \n  frameborder=\"0\">\n</iframe>

Renderuję go w szablonie erb w ten sposób:

<%= the_string %>

W tej chwili renderuje się w ten sposób:

&lt;iframe  class="some_class" type="text/html" src="/embed/iframe_content.html?id=tsqA5D7_z10" width="960" height="593"  marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

Muszę renderować go jako HTML.

Próbowałem następujące:

  1. <%= the_string.html_safe %>  # Renderuje ciąg bez zmian
  2. <%= CGI.unescapeHTML(the_string) %> # Błędy z błędem typu "nie mogą dupnąć NilClass"
  3. <%= CGI.unescapeHTML(the_string).html_safe %> # Błędy z błędem typu "nie mogą dupnąć NilClass"
  4. <%= raw the_string %> # Renderuje ciąg bez zmian

Jak mogę renderować ten ciąg jako HTML?


11
2018-05-20 22:53


pochodzenie




Odpowiedzi:


Jak się wydaje, zauważyłeś, są dwie rzeczy, którymi musisz się zająć:

  1. Unieważnianie encji HTML
  2. Drukowanie surowego html w widoku

Dla numeru 2 <%= raw ... %> powinien działać dobrze.

Dla numeru 1 CGI.unescapeHTML był dobrym pomysłem, ale nie sądzę, że rozpoznaje wszystkie encje HTML, więc poleciłbym rzucić okiem na HTML Entites gem

Możesz także spróbować użyć simple_format metoda pomocnika, ale myślę, że będziesz musiał przekazać jej kilka opcji, aby umożliwić <iframe> etykietka

również zdecydowanie sugerowałbym przeniesienie twojego unescaping logikę do metody pomocniczej.


18
2018-05-21 00:09



Dzięki za te sugestie. Spojrzę. - Undistraction
Dzięki jeszcze raz. Klejnot Entites HTML był odpowiedzią. - Undistraction


to, co możesz odczepić, nie może być ciągiem znaków i właśnie dlatego otrzymujesz błędy z błędem typu can't dup NilClass

Spróbuj
s = String.new your_obj.to_s

Teraz zrób

CGI.unescapeHTML(s)


7
2018-04-21 17:35



Pracujesz w kontrolerze? To jest właściwa odpowiedź, ale musisz zmienić to_s -> to_str. - jqr


W końcu musiałem użyć HTMLEntities Klejnot zasugerowany przez Mateusza;

  1. Zainstalował klejnot z RVM i dodał go do mojego Gemfile

  2. Wymagane w moim application.rb

  3. Oto jedyny sposób, w jaki mógłbym go poprawnie renderować. Zwróć uwagę na dodatkowe pojedyncze cudzysłowy owinięte wokół the_string. Bez nich nawiasy kątowe nie są renderowane, chociaż wszystko inne ma miejsce.

    coder = HTMLEntities.new
    raw coder.decode("'"+the_string+"'")
    

4
2018-05-21 01:34





Możesz spróbować tego:

<%= raw the_string %>

1
2018-05-20 23:01



Dzięki za sugestię, ale nie ma wpływu na ciąg znaków. - Undistraction


Wersja 3 brzmi wartościowo. Każdy powód, dla którego nie używasz the_string?

<%= raw CGI.unescapeHTML(the_string) %>


1
2018-05-20 23:30



Jak już wspomniałem w moim pytaniu, błąd kończy się błędem Błąd typu "nie można zduplikować NilClass" - Undistraction
W twoim pytaniu było inaczej. Wciąż ten sam błąd? - iltempo
Przepraszam. Masz rację. Ale nie. Ten sam wynik: błąd typu "nie można zduplikować NilClass" - Undistraction
CGI.unescapeHTML nie ma problemu z String, upewnij się, że the_string.is_a? (String) - Xiaohui Zhang