从Ruby返回一个javascript对象

时间:2011-03-30 06:09:39

标签: ruby-on-rails json

我们从ruby代码返回以下JSON:

{
 "label":"CPU-7",
 "data":[[50,45,38,34]],
 "settings":{
            "seriesDefaults":{
                             "renderer":"$.jqplot.BarRenderer"
                             },
            "axes":{
                   "xaxis":{
                           "renderer":"$.jqplot.CategoryAxisRenderer",
                           "ticks":[50,45,38,34]
                           }
                   }
            }
}

但是,“$ .jqplot.BarRenderer”是一个对象,我们不希望它以字符串形式返回,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:0)

在您的视图中尝试raw方法。它将按原样呈现数据。

<%= raw @data%>

UPADTE:

你是否在这样的控制器中渲染数据?

render :json => @data.to_json

答案 1 :(得分:0)

我认为这是不可能的。 JSON是一个简单的哈希,ruby不能包含javascript对象,并且没有办法(afaik)到JSON的eval部分。

所以我会建议类似的东西,让服务器渲染一个chart.js.erb而不是JSON,并将内部放在你编写完整$.jqplot函数的部分内。

答案 2 :(得分:0)

这并不直接回答您的问题,而是提供了另一种选择。如果您绝对必须做您想要的事情,请参阅下面的说明

您可能不希望您的ruby代码知道有关您的javascript对象的任何信息。相反,您可以维护某种type结构,这样如果您返回的数据类型为barChart,则可以通过这种方式引用它。类似的东西:

var chartTypes = {
  barChart: $.jqplot.BarRenderer
}

然后如果你回来了:

{"settings":{
  "seriesDefaults":{
    "type": "barChart"
  }
}

您可以使用

chartTypes[settings.seriesDefaults.type]

同样,我会避免让你的红宝石知道你的javascript对象或你实际渲染数据的方式。 Ruby应该只提供数据,javascript选择如何处理它。

注意

从json字符串中获取实际对象,只需执行

// not recommended!!!
var obj = eval(settings.seriesDefaults.renderer);