【问题标题】:JSON: Uncaught SyntaxError: missing ) after argument listJSON: Uncaught SyntaxError: missing ) 在参数列表之后
【发布时间】:2016-10-21 11:10:54
【问题描述】:

在 Rails 应用程序中,我在控制器中定义了一个对象,其中包含一个图标和一些值:

@data = "<i class='fa fa-circle fa-lg'></i><span>Speed: </span> #{b.speed.to_f} | Time: #{b.gps_date.try(:strftime, '%-m/%e %H:%M')}} <br />".html_safe.to_json

鉴于我这样解析它:

<script>
  var data = JSON.parse('<%= raw @data.as_json %>');
</script>

但我收到以下错误:

Uncaught SyntaxError: missing ) after argument list

当我删除包含类单引号的图标代码时,我工作正常

<i class='fa fa-circle fa-lg'></i>

我该如何解决这个错误?

【问题讨论】:

  • 不是解决方案,只是想知道,您为什么使用to_jsonas_json
  • 如果我不使用这些方法,我会得到同样的错误。我实际上是在 JavaScript 中使用这个对象,所以尝试了to_json,然后在 JS 中解析了 json
  • 这看起来不像一个对象。我猜您正在尝试构建一个 html 节点并将其传递给 JS,那么我猜只有 '&lt;%= raw @data %&gt;' 应该可以工作。你试过了吗?
  • 你是对的。删除了所有 json 解析代码,只使用了原始 @data。有效。感谢您的帮助
  • 我会把这个作为答案发布,如果你愿意,你可以接受。

标签: javascript ruby-on-rails json ruby


【解决方案1】:

您想将 HTML 字符串发送给 JS,因此需要 to_json,因为它用于将 Hash 转换为 JSON 。所以只需在服务器端使用html_safe

在客户端,因为你有字符串中的所有 HTML 不需要as_json,所以只需像在 JS 中一样使用字符串。 as_json 是一种用作 ActiveRecord Serializer 的方法。

@data = "<i class='fa fa-circle fa-lg'></i><span>Speed: </span> #{b.speed.to_f} | Time: #{b.gps_date.try(:strftime, '%-m/%e %H:%M')}} <br />".html_safe

var data = <%= raw @data %>;

【讨论】:

  • 是的,我是这个意思。无需解析为 JSON,因为那是一个字符串。发帖时忘记删除了:)
【解决方案2】:

基本上,这似乎是一个未转义的' 出现在JSON.parse('...') 中的问题。您可以通过查看呈现页面的 HTML 来验证问题。

我认为您可以通过声明(此处不需要.to_json)来解决您的问题:

@data = "<i class='fa fa-circle fa-lg'></i><span>Speed: </span> #{b.speed.to_f} | Time: #{b.gps_date.try(:strftime, '%-m/%e %H:%M')}} <br />".html_safe

然后在视图中使用

var data = "<%= escape_javascript @data %>";

由于您只是想传递一个字符串,因此无需转换为 JSON 对象然后将其解析回来。 (如果你想传递整个 JavaScript 对象/Ruby 哈希,你需要它)。

其实最后一行还有一个等效的快捷方式/别名:

var data = "<%= j @data %>";

PS:我描述了如何解决迫在眉睫的问题,但通常 MVC 的重点是在控制器中没有(或至少最小化)表示逻辑。一般来说,最好将数据传递给视图并在模板中生成 HTML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多