在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>
如何解决此错误?
答案 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。