在 rails 响应对象中呈现来自 mysql 数据库的 json 数据字段

Rendering json data fields from mysql db in rails response object

我有一个 rails 4.2 应用程序,它使用支持 json 字段的 mysql db 5.7。所以我的用户模型有一个名为 display_pic 的字段,它是一个 json 对象。

class User < ActiveRecord::Base
    serialize :display_pic, JSON
    ....

在动作中get_user我渲染用户如下

def get_user
  @u = User.where(...)
  render json: { user: @u }
end

问题是 json 字段 display_pic 不是嵌套的 json 对象,而是呈现为字符串。我希望收到如下回复

{ 
  "user": {
     "name": "some name", 
     "email": "some email",
     "display_pic": {
         "url": "http://someurl.com",
         "width": "400px",
      }
   }
}

使用下面的代码可以解决你的问题:

def get_user
  @u = User.where(...)
  render json: { user: JSON.parse(@u)}
end

您尝试过使用方法 .as_json 吗?

def get_user
  @u = User.where(...)
  render json: @u.as_json
end

您应该不需要设置序列化 :display_pic, :JSON,但您可以在 user.rb class 中重载该方法以便继续响应引用或方法结果自动加载到您的前端:

class PlayerCharacter < ApplicationRecord

      [...]
      def as_json(options = {})
        super(options.merge(include: [ :reference1, :reference2]).merge(methods: [:method_name1, :method_name2])
      end
end

编辑: 您可以添加 display_pic 如下:

class PlayerCharacter < ApplicationRecord

      [...]
      def as_json(options = {})
        super(options.merge(include: [ :display_pic])
      end
end

可能是更好的方法,但您可以在序列化程序中将其格式化为 json。

class UserSerializer < ActiveModel::Serializer
  attribute :name
  attribute :email
  attribute :display_pic

  def display_pic
    JSON.parse(object.display_pic)
  end
end