一尘不染

为什么要在渲染局部之前进行scape_javascript?

javascript

我正在看这个Railscast插曲,想知道为什么escape_javascript需要在这里致电:

$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");

有什么escape_javascript用?

根据Rails的文档:

escape_javascript(javascript)

转义符返回以及JavaScript段的单引号和双引号。

但这对我来说意义不大。


阅读 311

收藏
2020-05-01

共1个答案

一尘不染

如果将代码分为两部分,则更容易理解。

第一部分$("#reviews").append("<%= ... %>");是带有erb的javascript。这意味着,<%= ... %>它将被内部返回的任何红宝石代码替换。替换的结果必须是有效的javascript,否则客户端尝试对其进行处理时将抛出错误。这就是第一件事:您需要有效的javascript。

要考虑的另一件事是,ruby生成的任何内容都必须包含在带有双引号的javascript字符串内-注意周围的双引号<%= ... %>。这意味着生成的javascript将如下所示:

$("#reviews").append("...");

现在,让我们检查中的红宝石部分<%= ... %>。怎么render(:partial => @review)办?它正在呈现部分内容-这意味着它可以呈现任何类型的代码-html,css …甚至更多的javascript!

那么,如果我们的partial包含一些简单的html(如此),会发生什么呢?

<a href="/mycontroller/myaction">Action!</a> 

还记得您的JavaScript将双引号字符串作为参数吗?如果我们简单地用<%= … %>那个部分的代码替换,那么我们就会有一个问题-在href=双引号之后马上!javascript将无效:

// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");

为了避免这种情况的发生,您希望转义这些特殊字符,以便不对字符串进行剪切-您需要生成此字符的东西:

<a href=\"/mycontroller/myaction\">Action!</a>

这是escape_javascript做什么的。它确保返回的字符串不会“破坏” javascript。如果使用它,将获得所需的输出:

$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")

问候!

2020-05-01