为什么在视图中解析时,我的嵌入式ruby json字符串用html实体编码

Why is my embedded ruby json string encoded with html entities when parsed in the view?

本文关键字:字符串 json ruby html 编码 实体 嵌入式 我的 视图 为什么      更新时间:2023-09-26

我创建了一个rails操作,它向服务发出GET请求,然后将响应作为@job_data传递给视图。代码在检索响应时工作良好,并且我已经验证了json对象看起来是正确的。

def show
    @url = URI.parse(@@jobs_base_url + "/" + params[:id] + "?TestMode=true")
    req = Net::HTTP::Get.new(@url.to_s)
    res = Net::HTTP.start(@url.host, @url.port) {|http|
        http.request(req)
    }
    @job_data = HTMLEntities.new.decode res.body
end

然而,我试图做一点javascript来操纵DOM元素使用这个json对象。我正试图将脚本插入html中,用json对象做一些非常基本的事情,但似乎无法让它正确传递:

<script type="text/javascript" charset="utf-8">
$(function() {
    var $data = <%= @job_data %>;
    $('#jobtable').append($data.Id);

当我调试页面时,我看到字符串中的所有实体都被编码了(例如&quot而不是引号)。我试着用HTMLEntities去实体化字符串,就像上面的代码一样,但是它没有效果,就像我把@job_data设置为:

一样。
@job_data = res.body

谁能解释编码发生在哪里,我如何解决这个问题?是操作问题还是视图中的javascript问题?什么是首选的方式来传递json字符串/对象从一个动作响应到视图中的javascript ?

已经回答了:Ruby json gem正在编码html实体

技巧是在视图的嵌入式ruby中使用raw来避免编码:
var $data = <%= raw @job_data %>;