Forcing HTML Escaping In Rails 3
Solution 1:
Escape from ActiveSupport::SafeBuffer in Rails 3+
In this instance <%= my_string.to_str %>
will double-escape as required.
SafeBuffer workings
When a string is escaped by Rails you get an ActiveSupport::SafeBuffer
. From that point, extra escaping is skipped because the SafeBuffer
is html_safe?
. It's a clever solution! There are times though, that we wish to escape such cleverness.
Why double-escape?
I needed to re-escape content generated by tag helpers to pass generated markup to data-
attributes. This has also come in handy for displaying template-generated code.
Force-escape for a String
that's html_safe?
Call to_str
on the SafeBuffer
, which returns a String
.
# Example html safe content
content = content_tag :code, 'codez<>'
content.html_safe? # true
# call .to_str
escaped = content.to_str
escaped.html_safe? # false
# The escaped String will now be re-escaped when used in a template
The to_s
gotcha
The to_s
method looks very much like the to_str
method.
Don't use to_s
here, ActionView::SafeBuffer#to_s
just returns self
, where to_str
is called above the SafeBuffer
context, returning a naturally unsafe String
.
Solution 2:
Thanks to Sebastien for the suggestion, I wanted to get the real answer here and not buried in the comments:
I looks like this works:
<%= raw CGI::escapeHTML(my_string) %>
You need the "raw" call otherwise the escapeHTML makes the string unsafe in addition to escaping it so the auto escape double escapes it.
Solution 3:
To interpret the html (it's what i understood you need), you have to use :
<%= raw my_string %>
Post a Comment for "Forcing HTML Escaping In Rails 3"