如何将 Javascript 对象转换为 Rails 中的 JSON?

How to convert a Javascript object to JSON in Rails?

我在部分中有一个 Javascript 对象,如下所示:

_chart.js.erb

{
    chart: {
        animation: <%= @animation %>
    },
    plotOptions: {
       ...

这部分作为视图的一部分按预期工作。

我需要将其转换为 JSON 以用作命令行实用程序的配置。

什么是加载部分、插入 ERB、转换为 JSON 和 return 的 JSON 的好方法?

类似这样的方法可能会奏效,但似乎是一个糟糕的解决方案:

respond_to do |format|
  format.json { 
    js = File.read('app/views/trades/_chart.js.erb')
    hsh = eval(ERB.new(js).result)
    parsed = JSON.parse(hsh)

    render json: parsed.to_json
  }

要将 ERB 模板中定义的 javascript 对象转换为 JSON,您实际上必须执行以下操作:

js = render_to_string(partial: 'trades/chart', format: :js)
json_string = %x( node -e "JSON.stringify(#{js})" )
json_string.to_json

虽然任何 JSON 都有效 javascript,但反之则不成立。您的部分内容无效 JSON,因为未引用 属性 名称。因此,您必须通过 javascript 运行时将其转换为 JSON.

这假设部分渲染了一些实际上可以传递给 JSON.stringify 的东西,你必须处理疯狂的转义字符,如果部分包含你的文字或函数以外的任何东西,它就会爆炸JS运行时有。

这不是构建正常应用程序的方式。如果您需要在视图外使用数据,则不应在视图中定义它。

如 max 所述,将部分 JS 文件转换为 JSON 可能不是一个好主意。这是另一种方法(以及我最终使用的方法)。

class ChartConfig
  class << self
    def for params
      chart: {
        animation: params[:animation]
      },
      plotOptions: {
        ...

现在控制器看起来像这样:

respond_to do |format|
  format.json { render json: ChartConfig.for(animation: ... }