Визуализация переменной с помощью erb

У меня следующая проблема: у меня есть rhtml (html, измельченный вместе с ruby ​​внутри тегов <%%> и <% =%>), хранящийся в базе данных, которую я хочу отобразить. Информация получена через запрос. Мне нужно уметь оценивать информацию, которую я получаю из базы данных, как будто это был обычный контент внутри.erb-файла. Что у меня сейчас есть:

<% @mymods.each do |mod| %>
<%=  render_text(mod["html"])%>
<% end %>

Где mod["html"] - это переменная, содержащая rhtml-код и @mymods массив объектов из запроса. В настоящее время я понятия не имею, какую функцию мне следует использовать (render_text, конечно, не работает).

Помощь очень ценится.

/ TZer0

1 ответ

Решение

Вы можете использовать объект ERB для рендеринга текста без текста в файле.
Просто передайте текст с <%= %> теги. Вы можете поместить что-то вроде следующего в качестве функции application_helper.

def render_erb_text(text, args={})
   b = binding
   template = ERB.new(text, 0, "%<>")
   template.result(b)
end

И тогда в вашем шаблоне

<%=  render_erb_text("<%= %w(hi how are you).join(' - ') %>")%>

Вы также можете рассмотреть рендеринг текста в вашем контроллере, так как вы можете лучше обрабатывать любые ошибки рендеринга, чем во время оценки представления.

Посмотрите документацию ERB для получения дополнительной информации о привязке переменных и т. Д.

Я не знаком с деталями того, как это работает под прикрытием, но может быть некоторый серьезный риск при запуске этого кода на плохих или вредоносных данных базы данных. Оценка рубинового кода из пользовательского ввода или любого непроверенного источника должна быть сделана очень тщательно, если вообще.

Другие вопросы по тегам