【问题标题】:Can't dynamically add an id to div tag in rails helper无法在 rails helper 中将 id 动态添加到 div 标签
【发布时间】:2019-01-22 19:30:16
【问题描述】:

我遇到了一个非常奇怪的问题。这是我的看法:

<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

值得注意的是第二个sn-p中第一个方法的第3行。我无法让它为我的 div 标签添加一个 id!如果我将&lt;div id='#{date.to_s}-deals'&gt; 更改为&lt;div class='#{date.to_s}-deals'&gt;,它会添加类没问题,但如果我将其保留为id=,那么它只会创建一个没有属性的简单&lt;div&gt; 标签。

为了避免我们认为它与生成具有 id 的多个 div 相关(尽管 id 会有所不同),我还尝试从帮助程序生成一个简单的&lt;div id="thing" /&gt;,我得到了相同的空 div 标签结果。

WTF?

【问题讨论】:

  • 如果同一日期有多个交易,则 ID 将重复,并且 HTML 规范规定 ID 应该是唯一的。也许 Rails 或 Chrome 或有人正在强制执行?
  • @DaveSlutzkin,我不认为这是正确的。 div 为每个日期生成一次,因此它们应该保持唯一。
  • 我当然不建议使用content_tagtag(rails 5 的助手)来构建这样的html。它将有助于可维护性,并应避免这些类型的错误
  • 这似乎是真正属于部分而不是帮助者的东西。

标签: html css ruby-on-rails


【解决方案1】:

您必须将属性白名单传递给清理助手https://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize

允许id属性

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

在您的应用程序中设置默认允许的标签或属性

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

【讨论】:

  • 这似乎确实有效,但我必须添加我可能想要在每种情况下(或曾经,在配置场景中)使用的每个 attr 或标签似乎有点荒谬。我尝试了您的第一个建议,它似乎不允许所有其他属性和标签(例如,我的链接消失了)。这意味着如果没有选择任何属性,它应该允许一切,但我猜不是?
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多