参数列表后面的JSON:Uncaught SyntaxError:missing)

时间:2016-10-21 11:10:54

标签: javascript ruby-on-rails json ruby

在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>

如何解决此错误?

2 个答案:

答案 0 :(得分:2)

您希望将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 %>;

答案 1 :(得分:1)

基本上这似乎是'中某个未转义的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对象然后再解析它。 (如果你想传递一个完整的Javescript Object / Ruby Hash,你需要它。)

实际上,对于最后一行,还有一个等效的快捷方式/别名:

var data = "<%= j @data %>";
PS:我描述了如何解决即将发生的问题,但通常MVC的观点是没有(或至少最小化)控制器中的表示逻辑。通常,最好将数据传递给视图并在模板中生成HTML。