【问题标题】:How to display an array of HTML elements in a Rails view (as HTML, not strings) while using join使用连接时如何在 Rails 视图中显示 HTML 元素数组(作为 HTML,而不是字符串)
【发布时间】:2019-08-23 18:26:52
【问题描述】:

我有一个名为r 的对象,由于多对多关系,它具有属性subjects。我正在尝试使用link_to helper 将rsubjects 打印为链接,并使用join 将它们连接在一起。这是我的代码:

<%= r.subjects.map { |s| link_to  s.name, subject_path(s) } .join "," %>

但是,我将 HTML anchor 元素作为字符串而不是 HTML。我想获得实际的 HTML 锚元素。

【问题讨论】:

  • 您需要在每个字符串上调用html_safe 以使其“启用HTML”,但请注意:查看您的代码,如果主题名称包含HTML 代码,它将被视为HTML,所以这里有可能注入!
  • @MrYoshiji 主题名称只是一个字符串。我这里会有潜在的注射问题吗?
  • 是的,如果主题的名称是/&gt;&lt;b&gt;This is bold&lt;/b&gt; 或类似的名称,那么它将“解释”其中的 HTML
  • @MrYoshiji 如何解决这种注入威胁?

标签: html ruby-on-rails ruby


【解决方案1】:

您可以利用ActionView::Helpers::OutputSafetyHelper#safe_join 而不是join。在这个结果中,调用String#html_safe:

<%= safe_join(r.subjects.map { |s| link_to  s.name, subject_path(s) }, ',').html_safe %>

【讨论】:

  • 我尝试在map 函数内(在每个元素上)使用html_safe,但没有得到HTML 锚元素。你知道为什么这不起作用吗?
  • 不是因为html_safe是String对象方法,而link_toActiveSupport::SafeBuffer对象吗?
  • 这是我试过的:&lt;%= r.subjects.map { |s| (link_to s.name, subject_path(s)).html_safe } .join "," %&gt;
  • 删除join,并将其包裹在safe_join中,例如:&lt;%= safe_join(r.subjects.map { |s| (link_to s.name, subject_path(s)).html_safe }, ',') %&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2014-07-07
  • 2016-04-19
  • 2014-09-20
  • 2019-01-28
相关资源
最近更新 更多