Вызов ERB без Rails: неопределенный метод 'raw'

Я использую движок ERB для создать автономную HTML-версию страницы моего веб-сайта Rails. Страница отлично отображается в Rails, но у меня возникли проблемы с генерацией с помощью ERB (несмотря на использование того же шаблона ERB).

Сначала я получал ошибку undefined method 't', и я решил ее, заменив все вызовы <%=t(...)%> на <%=I18n.translate(...)%>.

Теперь я получаю undefined method 'raw'. Должен ли я заменить все вызовы <%=raw(...)%> чем-то другим? Если да, то что?


person Nicolas Raoul    schedule 31.10.2011    source источник


Ответы (2)


raw определен как помощник в библиотеке actionpack/action_view, так что без рельсов вы не сможете его использовать. Но шаблонизация ERB показывает свой вывод без экранирования:

require 'erb'
@person_name = "<script>name</script>"
ERB.new("<%= @person_name %>").result # => "<script>name</script>" 

И поэтому для побега есть ERB::Util#html_escape способ

include ERB::Util
ERB.new("<%= h @person_name %>").result # => "&lt;script&gt;name&lt;/script&gt;" 
person WarHog    schedule 31.10.2011
comment
Я бы предпочел использовать один и тот же файл ERB, а не один с необработанным и один без... Я добавил include OutputSafetyHelper (так же, как я уже включил свои пользовательские помощники), но получил uninitialized constant OutputSafetyHelper - person Nicolas Raoul; 31.10.2011
comment
попробуй include ActionView::Helpers::OutputSafetyHelper - person Marian Theisen; 31.10.2011
comment
Да, Мариан права. И не забудьте про require 'action_view'. И если вы используете версию Rails до 3.1.0, вы должны использовать ActionView::Helpers::RawOutputHelper вместо OutputSafetyHelper - person WarHog; 31.10.2011
comment
Я на рельсах 3.0.5. Вставка require 'action_view' с последующим include ActionView::Helpers::RawOutputHelper в начале моего файла Ruby решила проблему, большое спасибо! - person Nicolas Raoul; 31.10.2011
comment
Просто хотел вмешаться и сказать всем, кто может оказаться здесь, потому что это всегда появляется на первой странице Google при поиске RawOutputHelper, что даже если этот вопрос не имеет прямого отношения к вашей проблеме, Мэриан и УорХог правы. . Это решит любые проблемы вроде ActionView::Template::Error (неинициализированная константа ActionView::Helpers::RawOutputHelper). У меня был старый код, который включал RawOutputHelper, и я продолжал получать эту ошибку. Поскольку он не отображался в трассировке приложения, я был очень сбит с толку, пока не посмотрел на полную трассировку стека. - person seaneshbaugh; 27.12.2011

Хотя ответ @warhog будет работать, include не нужен. Он добавляет все методы ERB::Util в текущий класс, что обычно нежелательно и может вызвать неожиданные побочные эффекты (например, если у вас есть другой метод h). Вместо этого просто получите доступ к методу h (или другим помощникам) с помощью класса ERB::Util:

ERB.new("<%= ERB::Util.h @person_name %>").result

person scosman    schedule 05.09.2018