Я видел несколько похожих вопросов, но ни один из них не подходил для моей ситуации.
Я должен использовать HTML, смешанный с Ruby для некоторых тегов. Есть два метода, которые я нашел.
Метод А
<input id = "<%= id %>" />
По большей части это работает нормально, однако, если id представляет собой пустую строку или ноль, он все равно будет возвращать HTML следующим образом:
<input id />
Проблема: я бы предпочел полностью исключить тег «id», если переменная представляет собой пустую строку или ноль.
Метод Б
<input <%= "id=#{id}" unless id.blank? %> />
Если идентификатор представляет собой пустую строку, он вернет желаемый результат.
<input />
Проблема: Однако, если идентификатор содержит несколько пробелов, это вызывает проблему (это более актуально для таких тегов, как «значение»). Например, если «id» — «lorem ispum dolor sit amet», будет выведено:
<input id = "lorem" ipsum dolor sit amet />
У кого-нибудь есть лучший способ условного включения атрибутов HTML? Обратите внимание: я знаю, что могу использовать помощники Rails HTML, такие как text_field_tag, но я хотел бы найти решение без их использования.
Обновлено: я планирую сделать это с несколькими атрибутами HTML (например, <input id="<%= id %>" value="<%= value %>" name="<%= name %>" ... />
Вы можете использовать полную структуру условия:
<% unless id.blank? %>
<input id = "<%= id %>" />
<% else %>
<input />
<% end %>
Есть две основные проблемы
Когда id равен lorem" ipsum dolor sit amet
, этот фрагмент ERB
<input <%= "id=#{id}" unless id.blank? %> />
генерирует этот HTML.
<input id=lorem ipsum dolor sit amet />
В HTML5 кавычки необязательны, если только значение атрибута не содержит пробелов, поэтому идентификатором является только первое слово. Мы можем решить эту проблему, процитировав атрибут. Я использую здесь синтаксис строкового литерала %()
, чтобы нам не приходилось избегать двойных кавычек.
<input <%= %(id = "#{id}") unless id.blank? %> />
Это выводит идентификатор, который мы хотим.
<input id = "lorem ipsum dolor sit amet" />
id
не могут содержать пробелыЗначение
id
не должно содержать пробелов (пробелы, табуляции и т. д.). Браузеры обрабатывают несоответствующие идентификаторы, содержащие пробелы, как если бы пробелы были частью идентификатора.
Это то, что обычно работает совершенно нормально, пока не появится крайний случай, а он внезапно не исчезнет. Браузер проделывает большую работу, чтобы убедиться, что неверный HTML по-прежнему отображается, но мы можем облегчить себе жизнь в долгосрочной перспективе, придерживаясь спецификации. 😉
Используйте помощник тега :
<%= tag.input id: id %>
Если id
пусто, будет выведено:
<input>
Я отредактировал вопрос, чтобы показать, что я планирую сделать это с несколькими атрибутами, поэтому для чего-то подобного может оказаться слишком много условий цепочки.