Проблема с экранированием символов HTML в Rails 3 - PullRequest
0 голосов
/ 08 мая 2011

Я использую 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 Ответ

2 голосов
/ 08 мая 2011

Попробуйте это:

def foo(arr)
  result = ''
  arr.each do |a|
    result += content_tag(:div, a)
  end
  raw result
end

Редактировать.

Проще говоря, вы создаете строку, а Rails не знает, безопасно ли ее отображать. Чтобы быть еще более точным, Rails не сомневается относительно тегов content_tags, которые он создает.

Чтобы вы могли решить свою проблему, сообщив рельсам, что строка инициализатора безопасна:

def foo(arr)
  result = ''.html_safe
  arr.each do |a|
    result += content_tag(:div, a)
  end
  result
end
...