The official solution for this problem is to use e.g. CGI.escape thing.to_str,
my unofficial solution is to automate that 🙂
Code
# https://grosser.it/2012/08/16/rackutils-escape-unescape-cgi-escapeunescapeescapehtml-vs-undefined-method-bytesize-for-nil/
AUTOMATED_TO_STR_FOR_SAFE_BUFFER = <<-RUBY
def METHOD_with_html_safe(object)
if object.is_a?(ActiveSupport::SafeBuffer)
METHOD(object.to_str)
else
METHOD_without_html_safe(object)
end
end
alias_method_chain :METHOD, :html_safe
RUBY
# can be removed if
# Rack::Utils.escape "a & & %24".html_safe
# Rack::Utils.unescape "a & & %24".html_safe
# does not raise an error, must work with strings and symbols
Rack::Utils.class_eval do
[:escape, :unescape].each do |method|
eval AUTOMATED_TO_STR_FOR_SAFE_BUFFER.gsub("METHOD", method.to_s)
module_function :"#{method}_without_html_safe"
module_function method
end
end
# can be removed if
# CGI.escape "a & & %24".html_safe
# CGI.unescape "a & & %24".html_safe
# CGI.unescapeHTML "a & & %24".html_safe
# does not raise an error, must work with strings and symbols
# (escapeHTML always works)
CGI.class_eval do
class << self
[:escape, :unescape, :unescapeHTML].each do |method|
eval AUTOMATED_TO_STR_FOR_SAFE_BUFFER.gsub("METHOD", method.to_s)
end
end
end
Object.send :remove_const, :AUTOMATED_TO_STR_FOR_SAFE_BUFFER