рельсы 3 + креветка pdf + html_safe - PullRequest
6 голосов
/ 04 января 2012

Я использую камень креветок для создания отчетов в формате PDF,

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

при добавлении значений в таблицу PDF

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

в этом случае сгенерированный PDF имеет содержимое с тегами HTML, дажея попытался применить html_safe, но он не экранирует теги.

можно ли использовать / применять html_safe внутри pdftable для креветок, чтобы избежать тегов html?

Ответы [ 2 ]

5 голосов
/ 04 января 2012

Еще раз, html_safe - это не тот метод, который вам следует использовать; это не делает то, что вы думаете, что делает. Все, что html_safe делает, - помечает строку как безопасную, что говорит Rails, что ей не нужно экранировать ее в представлении. При использовании креветок это не будет иметь никакого эффекта.

Звучит так, будто вы хотите сделать это не escape HTML, а strip HTML-теги из строки. В Rails есть HTML-дезинфицирующее средство в ActionView::Helpers::SanitizeHelper, но по умолчанию он допускает определенные теги; Вы можете отключить это поведение, используя атрибут 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"

Вы можете include ActionView::Helpers::SanitizeHelper в вашем контроллере, чтобы получить доступ к методу sanitize.

Обратите внимание, что &nbsp; все еще находится в строке; если вы хотите удалить эти HTML-сущности, вам нужно использовать другой метод; HTMLEntities gem является одним из таких методов:

[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"

(обратите внимание, что в вашем примере текст говорит &nspb; вместо &nbsp;).

2 голосов
/ 09 августа 2013

Если вы ищете способ использовать встроенный формат креветок, вы также можете сделать следующее:

pdftable = Prawn::Document.new
cell = make_cell(content: "#{@user.description}", inline_format: true)
pdftable.table([[cell]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...