Невозможно динамически добавить идентификатор в тег div в помощнике по рельсам

У меня очень странная проблема. Вот мой взгляд:

<h1>All Deals</h1>

  <%= sanitize print_grouped_deals(@deals) %>

Вот мои сделки_helper.rb

  def print_grouped_deals(grouped_deals_by_date)
    grouped_deals_by_date.map do |(date, deals)|
      %(<div id='#{date.to_s}-deals'>
        <h3>#{brief_time date}</h3>
          #{deal_paragraphs_for_group(deals)}</div>)
    end.join
  end

  def deal_paragraphs_for_group(deals)
    deals.map do |deal|
      %(<p>#{"<span class='warning'>POSSIBLY EXPIRED! -</span>" if deal.probably_expired?} #{link_to deal.headline, deal}</p>)
    end.join
  end

Следует отметить 3-ю строку в первом методе во втором фрагменте. Я не могу заставить его добавить идентификатор в мой тег div! Если я изменяю <div id='#{date.to_s}-deals'> на <div class='#{date.to_s}-deals'>, класс добавляется без проблем, но если я оставлю его как id=, тогда он просто создаст простой тег <div> без атрибутов.

Чтобы мы не думали, что это как-то связано с созданием нескольких div с идентификаторами (хотя идентификаторы будут разными), я также попытался сгенерировать простой <div id = "thing" /> из помощника, и в результате я получаю те же пустые теги div.

ВТФ?

Идентификаторы будут дублироваться, если есть несколько сделок на одну и ту же дату, а спецификация HTML говорит, что идентификаторы должны быть уникальными. Может быть, Rails или Chrome, или кто-то применяет это?

Dave Slutzkin 22.01.2019 20:38

@DaveSlutzkin, я не думаю, что это правильно. div генерируется один раз для каждой даты, поэтому они должны оставаться уникальными.

Jonathan Tuzman 22.01.2019 20:40

Я, конечно, не рекомендовал бы создавать такой html, вместо этого используйте content_tag или tag (помощник для рельсов 5). Это поможет с ремонтопригодностью и позволит избежать ошибок такого типа.

engineersmnky 22.01.2019 21:12

Это похоже на то, что действительно принадлежит частичному, а не помощнику.

max 22.01.2019 22:55
Улучшение производительности загрузки с помощью 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 страниц, которые помогут...
3
4
344
1

Ответы 1

Вы должны передать белый список атрибутов помощнику очистки https://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize.

Чтобы разрешить атрибут id

<%= sanitize print_grouped_deals, attributes: %w(id) %>

To set the default allowed tags or attributes across your application

# In config/application.rb
config.action_view.sanitized_allowed_tags = ['div', 'h3']
config.action_view.sanitized_allowed_attributes = ['id', 'class']

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

Jonathan Tuzman 23.01.2019 00:54

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