RubyonRails:如何将字符串呈现为HTML?
我有RubyonRails:如何将字符串呈现为HTML?,html,ruby-on-rails,ruby,string,Html,Ruby On Rails,Ruby,String,我有 @str=“你好” 雇员再培训局认为: @str = "<b>Hi</b>" 当我真正想要的是Hi时,页面上将显示:Hi。ruby如何将字符串“解释”为HTML标记 编辑:以下情况 <%= @str %> @str=“你好” 如果在我看来是这样的话 @str = "<span class=\"classname\">hello</span>" HTML源代码是hello,我真正想要的是hello(没有转义双引号
@str=“你好”
雇员再培训局认为:
@str = "<b>Hi</b>"
当我真正想要的是Hi时,页面上将显示:Hi
。ruby如何将字符串“解释”为HTML标记
编辑:以下情况
<%= @str %>
@str=“你好”
如果在我看来是这样的话
@str = "<span class=\"classname\">hello</span>"
HTML源代码是
hello,我真正想要的是hello
(没有转义双引号的反斜杠)。“取消”这些双引号的最佳方式是什么?您正在将业务逻辑与内容混合在一起。相反,我建议将数据发送到您的页面,然后使用JQuery之类的工具将数据放在需要的地方
这样做的好处是将所有HTML都保存在它所属的HTML页面中,这样您的web设计人员就可以在以后修改HTML,而不必使用服务器端代码
或者,如果您不想使用JavaScript,可以尝试以下方法:
<%raw @str %>
@str=“你好”
至少这样,您的HTML就会出现在它所属的HTML页面中。使用:
但是,正如@ JMist253正确地说,考虑HTML真正属于什么地方。
< P>因为你正在翻译,并且从一个人的蹩脚编码文件中挑选出你想要的代码,你可以使用Cordon标签,和你的正则表达式的组合。
从api文档中窃取,您可以将翻译后的代码插入到内容\u标记中,如:
<%=raw @str >
“#{translated_class}”do-%>
#=>你好,世界!
由于不了解您的代码,这种想法将确保您翻译的代码过于兼容。UPDATE
出于安全原因,建议使用而不是
或
@str=“你好”
使用raw
很好,但它所做的只是将字符串转换为字符串,然后调用html\u-safe
。当我知道我有一个字符串时,我更喜欢直接调用html\u-safe
,因为它跳过了不必要的步骤,使发生的事情更清楚。有关字符串转义和XSS保护的详细信息,请参阅。您还可以使用简单_格式(@str)
删除恶意代码。请在此处阅读更多信息:或者您可以尝试CGI.unescapethtml方法
@str = "<b>Hi</b>"
<%= @str.html_safe %>
CGI.unescapeHTML“p这是一个段落。/p”
=>“这是一段。”
@str=“你好”
如果在我看来是这样的话
@str = "<span class=\"classname\">hello</span>"
HTML源代码是hello
,我真正想要的是hello
(没有转义双引号的反斜杠)。什么是最好的方式来“取消”这些双引号
解决方案:在单引号内使用双引号(或在双引号内使用单引号),以避免使用反斜杠转义
CGI.unescapeHTML "<p>This is a Paragraph.</p>"
=> "<p>This is a Paragraph.</p>"
@str='hello'
如果你在轨道上,最酷的方法是
@str = '<span class="classname">hello</span>'
<%raw @str %>
注意双等号。有关更多信息,请参阅相关问题。html\u安全版在Rails 4中运行良好
<%== @str >
问题是,我的应用程序接收了一个标记不好的文件,并通过正则表达式将其“翻译”为良好的HTML标记以发送到视图。因此,正在生成的HTML标记是动态的,因此我无法事先知道应该围绕@str的是哪些标记。如果不是在模型中,我将在哪里执行这种“翻译”工作?我认为我们不应该在视图中有广泛的逻辑代码。这实际上是一个意见问题。当开发一个新的应用程序时,我更喜欢尽可能保持一切清洁。但我们常常必须在别人留给我们的约束下工作。如果您的数据源返回HTML标记,那么不妨看看Michael Stum的解决方案中所述的使用“raw”。如果您继承了对某些代码的支持,并且代码中存在思维或设计欠佳的区域,那么清理它以提高可维护性确实是您的一部分责任。当它是一个很好的代码开始时,让它按您发现的方式运行是很好的,但是当它需要工作时,让它比您发现的更好是很好的。我的部分工作是管理一些遗留应用程序;我是一个不修复那些没有损坏的东西的粉丝,但是因为它们是如何编写的,所以它们不容易被增强。我不得不重写大部分函数调用,但现在使用起来容易多了。如果没有其他理由使用JS,就不应该在HTML插值中使用JavaScript。这将破坏非JS浏览器的网站(是的,有一些)。当然,如果你允许非转义内容,确保非邪恶标记的责任取决于你。嗨,这个解决方案有效,除了一个警告:请看编辑的问题我假设翻译的文本是div中的实际内容,对吗?例如,在这个例子中,应该是“Hello world!”?如果翻译的文本中有更多的HTML,比如嵌套的div或span,该怎么办?我会多次打电话给内容标签吗?还有。。。对不起,请提早进入。。。内部的每个嵌套div/span仍然是一个content_标记,您仍然需要验证它,对吗?因为我们看不到你的翻译技巧;-),我假设您查找所有标记,而不管正则表达式是否位于html的“父项”上。。。例如。你不会把所有的李都当作一根大绳子来打印吧?每一个都是它自己的内容标签:李,文本正确吗?太棒了。我找了一个小时也找不到该怎么做。谢谢你的回答。我一直使用
raw
。很高兴知道这件事!根据将来你可以考虑使用%Q[]语法来跳过字符串。e、 g%Q[“引号”]=>“引号”
来源:不知道这是否有帮助。
CGI.unescapeHTML "<p>This is a Paragraph.</p>"
=> "<p>This is a Paragraph.</p>"
@str = '<span class="classname">hello</span>'
<%raw @str %>
<%== @str >
<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>