Rails 3: экранирование пользовательского ввода работает по-разному в представлениях и почтовой программе

Я использую следующий набор кода как в своих представлениях, так и в почтовой программе:

<%= simple_format(auto_link(h(user_input))) %>

Я начинаю с вызова html_safe (h) для user_input, чтобы избежать любого опасного кода. Затем я вызываю auto_link, чтобы включить любые ссылки в их вводе, а затем я вызываю simple_format, чтобы включить разрывы строк и тому подобное.

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

" http://google.com "

Однако, когда то же самое отображается в электронной почте ActionMailer, я вижу, что все специальные символы, включая мою автоссылку, дважды экранированы (например, в результате &amp;quot; отображается неправильно):

&amp;quot; &lt;a href=3D&quot;http://google.com&quot;&gt;http://google.=com&lt;/a&gt; &amp;quot;

По какой-то причине мне нужно снова пометить его как html_safe, чтобы он заработал:

<%= simple_format(auto_link(h(user_input))).html_safe %>

Это правильно выводит:

&quot; <a href=3D"http://google.com">http://google.com</a> &quot;

Есть идеи, почему ActionView и ActionMailer по-разному обрабатывают один и тот же код?


person William Jones    schedule 24.07.2011    source источник
comment
@mu слишком короткий Мой файл шаблона электронной почты называется notify.html.erb   -  person William Jones    schedule 25.07.2011


Ответы (1)


Если вы вызываете simple_format из шаблона электронной почты (для рендеринга разрывов строк), поведение, которое вы получаете, ужасно необычное, и оказывается, что этот помощник перезаписывается закрытым методом.

В любом случае, вы можете получить доступ к simple_format в шаблоне электронной почты, используя этот хак:

ApplicationController.helpers.simple_format()

Надеюсь, в другом выпуске рельсов это будет исправлено.

person Bartuzz    schedule 10.08.2011