Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 序列化自定义属性_Ruby On Rails_Json_Serialization_Active Model Serializers - Fatal编程技术网

Ruby on rails 序列化自定义属性

Ruby on rails 序列化自定义属性,ruby-on-rails,json,serialization,active-model-serializers,Ruby On Rails,Json,Serialization,Active Model Serializers,我正在为我的应用程序使用activemodelserializergem。现在我遇到了这样的情况,用户可以拥有一个化身,它只是媒体的ID 我把化身信息保存到Redis中。因此,目前我在序列化JSON中显示化身的方法是: 类UserSerializer

我正在为我的应用程序使用
activemodelserializer
gem。现在我遇到了这样的情况,用户可以拥有一个化身,它只是媒体的ID

我把化身信息保存到Redis中。因此,目前我在序列化JSON中显示化身的方法是:

类UserSerializer
attributes :id,
           :name,
           :email,
           :role,
           :avatar

def avatar
    Medium.find(self.current_avatar)[0]
end

#has_one :avatar, serializer: AvatarSerializer

has_many :media, :comments

url :user
结束

我查询Redis以了解要在数据库中查找的媒体,然后在
:avatar
键中使用结果

在代码下面还有一行注释掉了,这是我在页面上找到的关于在序列化程序内部使用自定义序列化程序的唯一方法

所以来解决我的问题。现在,
:avatar
就像它在数据库中一样,但我希望它在作为JSON提供之前被序列化。
在这种情况下,我该怎么做?

您需要序列化Avatar类:

class Avatar
  def active_model_serializer
    AvatarSerializer
  end
end
那么你就用这种方式:

class UserSerializer < ActiveModel::Serializer
  include Avatar

  attributes :id,
             :name,
             :email,
             :role,
             :avatar

  def avatar
    # Strange you query another object 
    avatar = Medium.find(object.current_avatar).first
    avatar.active_model_serializer.new(avatar, {}).to_json
  end

  has_many :media, :comments

  url :user
end
class UserSerializer
根据文档,如果您想要自定义序列化程序,只需添加:

render-json:avatar,serializer:AvatarSerializer

或者,无论序列化程序的名称是什么,以下是文档:


请您解释一下“avatar,它只是一种媒体的if”是什么意思?一定是打字错误,avatar只是我从Redis获取媒体ID的一个类。所以化身只是一个用户选择的媒介,它在后端只被标记为medium_id。