2012-01-04 20 views
6

Używam krewetkę gem do generowania raportów w formacie PDF,szyny 3 + krewetka pdf + html_safe

@user.description returns as string "<b>sample text</b> &nspb; <p>sample text</p>" 

natomiast dodanie wartości do tabeli pdf

pdftable = Prawn::Document.new 
pdftable.table([["#{@user.description}"]], 
     :column_widths => {0 => 50, 1 => 60, 2 => 280, }, :row_colors => ["ffffff"]) 

w tym przypadku wygenerowany plik PDF zawiera treści z HTML tagi, nawet ja próbowałem zastosować html_safe, ale nie jest to tag uciekający.

Czy możliwe jest użycie/zastosowanie html_safe wewnątrz pdftable krewetki, aby uniknąć tagów html?

+0

Co jest wyświetlany w formacie PDF, dokładnie, i to, co chcesz, aby pokazać się w zamian? –

+0

w pdf jej pokazywaniem „przykładowy tekst &nspb;

przykładowy tekst

”, a nie powinno być tylko to znaczy tekst „Przykładowy tekst przykładowy tekst”, html_safe należy stosować – lamrin

+0

Niestety, ale to nie to, co robi html_safe' '- go po prostu mówi Railsom, że ciąg znaków nie powinien być zmieniony, gdy jest używany w widoku. Sprawdź [to pytanie] (http://stackoverflow.com/questions/7414267/strip-html- from-string-ruby-on-rails), aby znaleźć rozwiązanie. –

Odpowiedz

5

Po raz kolejny html_safe nie jest metodą, z której powinieneś korzystać; nie robi to, co myślisz, że robi. Wszystko, co robi html_safe, oznacza, że ​​łańcuch jest bezpieczny, a tym samym mówi Railsom, że nie musi uciekać w widoku. Podczas używania Krewetki nie przyniosłoby to efektu.

Co brzmi jak chcesz zrobić nie jest ucieczka HTML, ale pas znaczniki HTML z ciągu znaków. Railsy mają sanitizer HTML w ActionView::Helpers::SanitizeHelper, ale domyślnie dopuszcza pewne tagi; możesz wyłączyć to zachowanie, używając atrybutu tags.

class MyClass 
    include ActionView::Helpers::SanitizeHelper 

    def remove_html(string) 
    sanitize(string, :tags => {}) # empty tags hash tells it to allow no tags 
    end 
end 

obj = MyClass.new 
obj.remove_html "<b>sample text</b> &nspb; <p>sample text</p>" 
=> "sample text &nspb; sample text" 

Można include ActionView::Helpers::SanitizeHelper w kontrolerze, aby uzyskać dostęp do metody sanitize.

Należy pamiętać, że &nbsp; jest nadal w ciągu; jeśli chcesz usunąć te elementy HTML, musisz użyć innej metody; HTMLEntities gem jest jednym z takich sposobów:

[1] pry(main)> require 'htmlentities' 
=> true 
[2] pry(main)> coder = HTMLEntities.new 
=> #<HTMLEntities:0x007fb1c126a910 @flavor="xhtml1"> 
[3] pry(main)> string = "sample text &nbsp; sample text" 
=> "sample text &nbsp; sample text" 
[4] pry(main)> coder.decode string 
=> "sample text   sample text" 

(zauważ, że w swoim przykładzie, tekst mówi &nspb; zamiast &nbsp;).

+0

Wielkie dzięki, pomogło mi to w niewielkim stopniu, ale niektóre tagi wygenerowane przez jednego z edytorów HTML Tinymce nie są konwertowane do rzeczywistego tekstu z htmlentities, ale działa naprawdę dobrze, gdy używam raw lub htnm_safe w widoku. – lamrin

2

Jeśli szukasz sposobu, aby wykorzystać inline formatu krewetka, niż można również zrobić w następujący sposób:

pdftable = Prawn::Document.new 
cell = make_cell(content: "#{@user.description}", inline_format: true) 
pdftable.table([[cell]]) 
+0

użyłem tej odpowiedzi, ale renderowałem w widoku i dlatego musiałem użyć 'pdf.make_cell (...)' – daslicious