【问题标题】:How to convert Ruby hash rocket into a valid JSON?如何将 Ruby 哈希火箭转换为有效的 JSON?
【发布时间】:2015-10-02 03:04:46
【问题描述】:

我尝试获取这种 JSON 数据:

[
   {
      "id":3,
      "foods": [{'id':2,'name':'Nasi Minyak','qty':6},{'id':14,'name':'Kuey teow','qty':3}]
   },
   {
      "id":4,
      "foods": [{'id':2,'name':'Nasi Minyak','qty':1},{'id':14,'name':'Kuey teow','qty':1}]
   }
]

请注意,foods 对象的开头和结尾没有双引号 "

我现在是这样的:

[
       {
          "id":3,
          "foods": "[{:id=>2, :name=>"Nasi Minyak", :qty=>6}, {:id=>14, :name=>"Kuey teow", :qty=>3}]"
       },
       {
          "id":4,
          "foods": "[{:id=>2, :name=>"Nasi Minyak", :qty=>1}, {:id=>14, :name=>"Kuey teow", :qty=>1}]"
       }
    ]

显然,它是一个字符串,而不是我想要的数组。这给我带来了问题,因为我需要在我的应用程序的前端使用这个 JSON 数据(使用 Angular 构建并使用 AJAX / $http 进行了很多操作)。

我的控制器中有这个:

class Api::OrderController < ApplicationController

    # GET /api/orders
    def index
        @orders = Order.all

        render json: @orders
    end

end

这是我的 order_serializer 文件。

class OrderSerializer < ActiveModel::Serializer
  attributes :id, :foods
end

我尝试过的:

尝试 #1

我尝试将我的订单模型更改为这样的:

class Order < ActiveRecord::Base
    serialize :foods, Array
end

然后我尝试使用这样的 Rails 控制台 update_attributes foods

o.update_attributes :foods => [{'id':2,'name':'Nasi Minyak','qty':6},{'id':14,'name':'Kuey teow','qty':3}]

但这对我不起作用。 JSON 数据仍在哈希火箭中。

尝试 #2

我试试to_json。但是还是不行。

如何去掉双引号 " 标记并在 Rails 中正确保存有效的 JSON 数组?

注意

我数据库中的foods 列是text。不是string。我相信它与这个问题无关。

我找到了这个tutorial,但我找不到办法。

【问题讨论】:

  • 我在这里是否缺少任何用例,因为我没有将 Food 作为单独的模型,然后将 Order 与之关联?
  • 数据库中的字符串和文本是一样的。一个可能是一个固定长度的字符串,但是一旦它们进入 Ruby,它们仍然是等价的。
  • @Surya 我没有Food 模型。 foods 数据将从前端推送。 Order 模型只是保存它,没有任何关联。
  • serialize 想要JSONMarshal 之类的东西吗?我不确定Array 是一个有效的序列化程序。

标签: ruby-on-rails ruby json ruby-on-rails-4 rails-activerecord


【解决方案1】:

您应该创建一个名为 Food 的类和另一个名为 OrderItem 的类,然后在您的 Order 类中定义一个关系:

has_many :order_items
has_many :food, :through => order_items

这样你就有了两个独立的类:Order 和 Food,通过 OrderItem 类你可以在它们之间创建一个关系,这样你就可以保持逻辑分离。

每种食物都有自己的名称和 ID,但数量会进入 OrderItem 表。

【讨论】:

  • 你能再补充一些吗?还是没明白。如果您也可以共享一些代码,那将非常有帮助。
  • 读一读:guides.rubyonrails.org/… 如果您以这种方式分离模型,则在将它们转换为 json 时应该没有任何工作
  • 假设我在这个 API 控制器中添加了create 方法,并且这个create 方法正在接收来自我的前端应用程序的POST 请求,其中包含[{"id":2,"name":"Nasi Minyak","qty":10},{"id":14,"name":"Kuey teow","qty":10}] 之类的参数数据,如何@ 987654327@ 捕获它并将qty 传递给 OrderItem?
  • 您可以使用 JSON.parse 方法解析您收到的 json 数据,然后使用您需要的信息创建 Order 和 OrderItem 对象。
【解决方案2】:

试试这个:

render json: @orders.to_json

如果您的应用是 API,请尝试使用 active_model_serializers gem。 它返回序列化的模型。

更新:

class OrderSerializer < ActiveModel::Serializer
  attributes :id
  has_many :foods
end

render json: @orders

【讨论】:

  • 已经在使用to_jsonactive_model_serializers。但还是不行。
  • 你能把你的 OrderSerializer 放进去吗?
  • 还是不行。它仍然是字符串并且有双引号 " 标记。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2016-09-14
相关资源
最近更新 更多