如何在 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 = <%= raw @serialized_data.to_json %>;
的事情。
【参考方案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函数?