我有
@str ="Hi"
在我的erb视图中:
当我真正想要的是Hi时,页面上将显示:Hi。 将字符串"解释"为HTML标记的红宝石方法是什么?
编辑:这种情况
@str ="hello"
如果我认为
HTML源代码是>,其中我真正想要的是hello(不带转义双引号的反斜杠)。"取消转义"双引号的最佳方法是什么?
您可能还考虑使用%Q []语法进行字符串转义。 例如%Q["quotation marks"] =>""quotation marks""来源:en.wikibooks.org/wiki/Ruby_Programming/Syntax/不知道是否有帮助。
更新
出于安全原因,建议使用sanitize代替html_safe。链接
发生的事情是,作为一种安全措施,Rails正在为您转义您的字符串,因为其中可能嵌入了恶意代码。但是,如果您告诉Rails您的字符串是html_safe,它将直接通过它。
@str ="Hi".html_safe
要么
@str ="Hi"
使用raw可以很好地工作,但是要做的就是将字符串转换为字符串,然后调用html_safe。当我知道我有一个字符串时,我更喜欢直接调用html_safe,因为它跳过了不必要的步骤,使事情更清晰。有关字符串转义和XSS保护的详细信息,请参阅此Asciicast。
太棒了搜索一个小时后,我仍然找不到该怎么做。感谢您的回答。
我一直使用raw。很高兴知道这一点!
向未来致敬=)
根据stackoverflow.com/questions/44575106/删除了sanitize
使用原始:
但是,正如@ jmort253正确说的那样,请考虑HTML真正所属的位置。
嗨,此解决方案有效,除了一个警告:请参阅编辑后的问题
如果您使用的是使用Erubis的rails,最酷的方法是
请注意双等号。有关更多信息,请参见SO的相关问题。
您还可以使用simple_format(@str)删除恶意代码。在此处信息:http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
您正在将业务逻辑与内容混合在一起。相反,我建议将数据发送到您的页面,然后使用JQuery之类的东西将数据放置在需要的地方。
这具有将所有HTML保留在其所属的HTML页面中的优势,因此您的Web设计人员可以稍后修改HTML,而无需倒入服务器端代码。
或者,如果您不想使用JavaScript,则可以尝试以下操作:
@str ="Hi"
至少以这种方式,您的HTML位于它所属的HTML页面中。
问题是,我的应用程序正在接收标记不良的文件,然后通过正则表达式将其"转换"为良好的HTML标记以发送到视图。因此,正在生成的HTML标记是动态的,因此我无法知道先验哪些标记应该包围@str。如果不在模型中,我将在哪里执行"翻译"工作?我认为我们不应在视图中包含大量的逻辑代码。
这确实是一个见解的问题。在开发新的应用程序时,我希望尽可能保持所有内容的清洁。但是,有时我们必须在别人给我们留下的束缚之内工作。如果您的数据源返回HTML标记,则可以按照Michael Stums解决方案中的描述使用"原始"格式。
如果您继承了某些代码的支持,并且代码中的区域显示出不良的思维或设计,那么清理它以使其更易于维护确实是您职责的一部分。当您开始编写出色的代码时,将其保留为您的感觉很好,但是在需要工作时,将其保留为比您发现的更好。我的工作之一是管理一些旧版应用程序;我热衷于不修复未损坏的东西,但由于其编写方式而无法轻松进行增强。我不得不重写大多数函数调用,但是现在使用它要容易得多。
如果没有其他理由使用JS,则不应将JavaScript用于HTML插值。对于非JS浏览器,这会破坏您的网站(是的,有一些)。
html也属于助手,有时也禁止在数据库中使用。虽然我宁愿存储markdown,然后渲染为html。
@Macario-嗨,我不确定我是否完全理解您的评论。你介意吗?谢谢!
好吧,有时候html是在模板的外部生成的,它需要一个辅助函数,不需要逃脱,或者有时候-尽管我认为这是一种不好的做法,而且不是很漂亮-它是由用户由WYSIWG编辑器生成并存储在数据库中的作为html,并且也不需要逃脱,当然,它需要进行清理,否则可能会发生不好的事情。我更喜欢使用模板语言Markdown来让用户输入样式化的内容。在这种情况下,您不希望您的内容被转义是这种方式。
当然,如果您允许非转义的内容,那么确保非邪恶的标记取决于您。
或者,您可以尝试CGI.unescapeHTML方法。
CGI.unescapeHTML"
This is a Paragraph.
=>"
This is a Paragraph.
html_safe版本在Rails 4中运作良好...
Administrators only ".html_safe if current_user.admin? %
>
@str ="hello"
If in my view I do
The HTML source code is hello where what I really want is hello (without the backslashes that were escaping the double >quotes). What's the best way to"unescape" those double quotes?
解决方案:在单引号内使用双引号(或在双引号内使用单引号),以避免使用反斜杠转义。
@str = 'hello'
由于您正在翻译,并且从一个人的s脚的编码文件中选择了想要的代码,您是否可以将content_tag与正则表达式结合使用?
您可以从api文档中窃取此翻译后的代码,插入到content_tag中,例如:
"#{translated_class}" do -%>
# => Hello world!
不知道您的代码,这种想法将确保您翻译的代码过于合规。
我假设已翻译的文本是div中的实际内容,对吗?即,在示例中,它是" Hello world!"?如果translation_text中包含更多HTML,即嵌套的div或spans,该怎么办?那时我需要多次调用content_tag吗?
和...抱歉,请早点输入...里面的每个嵌套div / span仍然是content_tag,尽管如此,您仍然需要对其进行验证?由于我们看不到您在用花哨的翻译;-)做些什么,因此Id假设您正在寻找所有标签,无论regex是否位于html的父级上……
。您不会把所有lis当作大屁股绳打印吗?每个人都有自己的content_tag:li,文字正确吗?