Условный HTML-атрибут с использованием Rails ERB

Я видел несколько похожих вопросов, но ни один из них не подходил для моей ситуации.

Я должен использовать 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 %>" ... />

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
0
1 316
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать полную структуру условия:

<% unless id.blank? %>
  <input id = "<%= id %>" />
<% else %>
  <input />
<% end %>

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

Jack Walsh 15.12.2020 06:45
Ответ принят как подходящий

Есть две основные проблемы

Проблема 1: значения атрибутов HTML, содержащие пробел, должны быть заключены в кавычки

Когда 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" />

Проблема 2: атрибуты id не могут содержать пробелы

По MDN,

Значение id не должно содержать пробелов (пробелы, табуляции и т. д.). Браузеры обрабатывают несоответствующие идентификаторы, содержащие пробелы, как если бы пробелы были частью идентификатора.

Это то, что обычно работает совершенно нормально, пока не появится крайний случай, а он внезапно не исчезнет. Браузер проделывает большую работу, чтобы убедиться, что неверный HTML по-прежнему отображается, но мы можем облегчить себе жизнь в долгосрочной перспективе, придерживаясь спецификации. 😉

Используйте помощник тега :

<%= tag.input id: id %>

Если id пусто, будет выведено:

<input>

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