【问题标题】:Prevent Ruby from changing & to &?防止 Ruby 将 & 更改为 &?
【发布时间】:2016-07-14 19:14:38
【问题描述】:

我需要在我的网页标题中显示一些上标和下标字符。我有一个辅助方法可以识别下标或上标的模式,并将其转换为 &sub2;或²

但是,当它显示在渲染页面的文件中时,它在源代码中显示为:

&sub2;

这是不对的。我将其设置为:

<% provide(:title, raw(format_title(@hash[:page_title]))) %>

但是原始文件不起作用。任何帮助表示赞赏。

方法:

def format_title(name)
label = name
if label.match /(_[\d]+_)+|(~[\d]+~)+/
  label = label.gsub(/(_([\d]+)_)+/, '&sub\2;')
  label = label.gsub(/(~([\d]+)~)+/, '&sup\2;')
  label.html_safe
else
  name
end

结束

我什至尝试过:

str.gsub(/&amp;/, '&')

但它会回馈:

&amp;amp;sub2;

【问题讨论】:

  • 你的 format_title 方法中有什么?
  • &lt;% provide.... 缺少= 是不是错字?在.erb 中,为了让嵌入的红宝石可见,我们必须使用&lt;%= provide...,对吧?
  • 添加方法@NicNilov

标签: ruby-on-rails ruby


【解决方案1】:

您也可以使用 Rails I18n 实现此目的。

<%= t(:page_title_html, scope: [:title]) %>

并且在您各自的语言环境文件中。 (title.en.yml 最有可能):

title:
  page_title: "Title with &sup2;"

这是HTML symbols 关于下标和上标的图表。

更多信息请查看Preventing HTML character entities in locale files from getting munged by Rails3 xss protection


更新

如果您需要动态加载页面标题,首先,您必须安装像 Page Title Helper 这样的 gem。

您可以按照 gem 文档中的指南进行操作。

【讨论】:

  • 不幸的是,这对我不起作用,因为页面标题会根据您所在的页面动态变化。
【解决方案2】:

你的例子有两个问题,一个是物质问题,另一个只是巧合。

第一个问题是您尝试使用实际上不存在的字符实体。具体来说,只有&amp;sup1;&amp;sup2;&amp;sup3;分别提供123上标符号。没有像&amp;sup4; 这样的字符实体,也没有任何其他上标数字。尽管您可以使用其他数字的裸码点,但这需要更多涉及的代码。

更重要的是,HTML5 character entities list 中根本没有下标字符实体。所有下标数字都是裸码点。因此,用&amp;sub2; 或任何其他“下标”数字替换任何内容都是没有意义的。

您没有看到您的示例工作的原因是由于您选择的测试字符串。提供带有下划线的任何内容,例如 _2_mystring 将被 &amp;sub2; 正确替换。由于&amp;sub2; 字符实体不存在,字符串将按原样显示,给人一种raw 方法不起作用的印象。

尝试使用~2~mystring,它将被替换为上标字符实体&amp;sup2;,并正确呈现。这说明您的代码正确,但关于字符实体的基本假设不正确。

【讨论】:

  • 添加 标签对我没有帮助,因为这个值需要出现在 标签之间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多