интерполяция строк для значения атрибута в двойных кавычках в erb

Как я могу написать выражение erb с экранированием атрибутов в двойных кавычках и получить правильное поведение экранирования?

Например, мне нужно что-то, что будет выводить:

value="Hello World"

если should_print_value истинно, и при условии, что myvalue = Hello World

Изменить: Примечание. myvalue может содержать вредоносный контент.

Подход 1

Если я попробую что-то вроде

<%= "value=\"#{myvalue}\"" if should_print_value %>

erb будет экранировать двойные кавычки, что приведет к value=&quotHello и другому атрибуту с именем World&quot=""

Подход 2

Самое простое решение, которое я придумал, это сделать:

<% if should_print_value %>
  value="<%= myvalue %>"
<% end %>

Но мне все еще любопытно, возможно ли использовать синтаксис <%= "value=.... %> Подхода 1.


person mark    schedule 23.03.2015    source источник
comment
попробуй "value=\"#{myvalue}\"".html_safe. Чего вы пытаетесь достичь? Может есть более простой способ.   -  person BroiSatse    schedule 24.03.2015
comment
Я забыл указать, что myvalue не является доверенным и может содержать вредоносный XSS-контент, поэтому .html_safe неприемлем.   -  person mark    schedule 24.03.2015
comment
отвечая на ваш вопрос, я просто пытаюсь условно добавить атрибут value к элементу HTML в шаблоне erb (среди других условных атрибутов). В моем случае это тег ввода текста.   -  person mark    schedule 24.03.2015


Ответы (2)


Как указал @BroiSatse, либо используйте:

<%= "value=\"#{myvalue}\"".html_safe if should_print_value %>

или, что я бы предпочел во взглядах:

<%= raw "value=\"#{myvalue}\"" if should_print_value %>

Это пометит содержимое как безопасное, однако вам нужно будет обратить внимание на то, что myvalue не является вредоносным. Вы можете использовать такой метод, как CGI.escape, для правильного форматирования специальных символов, которые могут представлять угрозу безопасности.

person Rudolf    schedule 23.03.2015
comment
Это верно, я забыл указать, что myvalue является потенциально вредоносным. Я бы предпочел не использовать .html_safe или raw, потому что многие люди сотрудничают с этим кодом, и использование любого из них вызывает красные флажки. - person mark; 24.03.2015
comment
Если вы просто экранируете свой myvalue с помощью CGI.escape, вы можете без проблем использовать raw и .html_safe ;) - person Rudolf; 24.03.2015
comment
На самом деле это единственное встроенное решение, поскольку в противном случае кавычки всегда будут экранироваться при печати. ruby-doc.org/ стандартная библиотека-1.9.3/libdoc/cgi/rdoc/ - person Rudolf; 24.03.2015

Если вы привержены встроенному решению, <input ...value="<%= myvalue if should_print_value %>"> должен вставить правильно экранированный myvalue или пустую строку (фактически сообщая, что ввод пуст), в зависимости от should_print_value. Я, вероятно, просто воспользуюсь вашим подходом 2, так как он кажется мне более ясным.

person Andrew Larson    schedule 24.03.2015