Проблема с экранированием символов HTML в Rails 3
Я использую foo
вспомогательная функция на мой взгляд:
<%= foo ["hello", "stack", "overflow"] %>
когда foo
определяется так:
def foo(arr)
result = ''
arr.each do |a|
result += content_tag(:div, a)
end
result
end
Страница отображает:
<div>hello</div><div>stack</div><div>overflow</div>
Но, если изменить foo
определение должно быть:
def foo(arr)
content_tag(:div, arr[0]) + content_tag(:div, arr[1]) + content_tag(:div, arr[2])
end
Я получаю ожидаемый результат:
hello
stack
overflow
Как бы вы исправить foo
определение выше, чтобы получить ожидаемый результат? (т.е. я не хочу, чтобы символы убегали)
1 ответ
Решение
Попробуй это:
def foo(arr)
result = ''
arr.each do |a|
result += content_tag(:div, a)
end
raw result
end
Редактировать.
Чтобы быть более понятным, вы создаете строку, а Rails не знает, безопасно ли ее отображать. Чтобы быть еще более точным, Rails не сомневается в том, что он создает content_tags.
Таким образом, вы можете решить проблему, сообщив rails, что строка инициализатора безопасна:
def foo(arr)
result = ''.html_safe
arr.each do |a|
result += content_tag(:div, a)
end
result
end