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

Posted

技术标签:

【中文标题】如何在 Rails 中将 Javascript 对象转换为 JSON?【英文标题】:How to convert a Javascript object to JSON in Rails? 【发布时间】:2021-10-31 05:17:48 【问题描述】:

我有一个部分 javascript 对象,如下所示:

_chart.js.erb


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

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

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

什么是加载部分、插入 ERB、转换为 JSON 并返回 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
  

【问题讨论】:

这听起来像是一个综合性的 X & Y 问题。如果您需要创建一个类似哈希的结构并在视图之外使用它,那么不要一开始就放入 js.erb 模板。 而只是使用序列化程序或方法方法,将数据作为输入并返回可以转换为 JSON 的哈希值。转到 JSON 后,除非您正在构建 Ruby Goldberg 机器(双关语),否则您不会将其转换回来。 我认为您不了解用例。我有已经在部分中使用的 Javascript 对象。我想将 same 部分作为 JSON 用于命令行工具。 +1 到@max 建议。如果您在视图之外需要它,则不应在视图中定义它。如果它是静态哈希,我会将其放入 YAML 文件(或类似文件)并将其发送到视图/您需要的任何其他地方。 是的,我明白了。您的部分应该只是做类似let data = &lt;%= raw @serialized_data.to_json %&gt;; 的事情。 【参考方案1】:

要将在 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 运行时具有的函数之外的任何内容,它就会爆炸。

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

【讨论】:

我明白了...我将看到如何在 Ruby 中定义哈希,然后将其转换为 JS 和 JSON。【参考方案2】:

正如 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: ... 

【讨论】:

以上是关于如何在 Rails 中将 Javascript 对象转换为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rails视图中将Ruby变量传递给JavaScript函数?

Rails - 将信息从视图传递到 Javascript

在 Rails 4.1 中将页面特定的 jQuery 代码放在哪里?

如何在 Rails 中将当前时间添加 10 天

如何在 Rails 迁移中将列(包含内容)移动到另一个表?

在 Rails 中将 2 个表导出为 CSV [如何选择特定列?]