Проблема с экранированием символов 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
Другие вопросы по тегам