Ruby on rails 活动模型序列化程序不使用rails api gem

Ruby on rails 活动模型序列化程序不使用rails api gem,ruby-on-rails,active-model-serializers,rails-api,Ruby On Rails,Active Model Serializers,Rails Api,我在json api的项目中使用了rails api gem,为此,我使用了活动模型序列化器gem来序列化我的对象,但有些情况下,这些对象没有使用活动模型序列化器进行序列化 我的serializers文件夹中有一个MessageSerializer class MessageSerializer < ActiveModel::Serializer attributes :id, :sender_id, :recipient_id, :sender_type, :subj, :body,

我在json api的项目中使用了rails api gem,为此,我使用了活动模型序列化器gem来序列化我的对象,但有些情况下,这些对象没有使用活动模型序列化器进行序列化

我的serializers文件夹中有一个MessageSerializer

class MessageSerializer < ActiveModel::Serializer
  attributes :id, :sender_id, :recipient_id, :sender_type, :subj, :body, :status, :sender

  def sender
    object.user.try('username')
  end
end
class MessageSerializer
我的消息如下

class Api::MessagesController < Api::BaseController

  def index
    @messages = current_user.incoming_messages
    render json: @messages, serializer: MessageSerializer
  end

end
class Api::MessagesController
但问题是,抛出到客户端的序列化对象包含消息模型ie中的所有字段;它包含已创建的\u at和已更新的\u at字段

似乎它没有使用序列化程序

可能出了什么问题? 我对此搜索了很多,但没有找到任何有帮助的帖子


谢谢

您使用的是什么版本的AMS

我也遇到了同样的问题,通过将AMS版本从0.9.X更改为0.8.X,我可以解决这个问题。这可以通过向文件中添加版本号来实现

gem 'active_model_serializers', '~> 0.8.0'
AMS GitHub回购协议中有相关注释


我没有降级,我花了一些时间尝试不同的事情,最后我得到了如下模式:

def sender
  if object.sender
    serializer = SenderSerializer.new(object.sender)
    ActiveModel::Serializer::Adapter::JsonApi.new(serializer).as_json[:senders]
  end
end
def attachments
  attachments = object.attachments.to_a
  return [] if attachments.empty?
  serializer = ActiveModel::Serializer::ArraySerializer.new(attachments, each_serializer:AttachmentSerializer)
  ActiveModel::Serializer::Adapter::JsonApi.new(serializer).as_json[:attachments]
end
这很难看,但对我来说很有帮助

对于一个有很多关系的人,你可以这样做:

def sender
  if object.sender
    serializer = SenderSerializer.new(object.sender)
    ActiveModel::Serializer::Adapter::JsonApi.new(serializer).as_json[:senders]
  end
end
def attachments
  attachments = object.attachments.to_a
  return [] if attachments.empty?
  serializer = ActiveModel::Serializer::ArraySerializer.new(attachments, each_serializer:AttachmentSerializer)
  ActiveModel::Serializer::Adapter::JsonApi.new(serializer).as_json[:attachments]
end

在BaseController中,是否添加了以下include命令


include ActionController::Serialization

这是因为在rails api中默认情况下不加载序列化。
你必须这样做:

class ApplicationController < ActionController::API
  include ::ActionController::Serialization
end
class ApplicationController
将此更改为
class Api::MessagesController
更改为
class Api::MessagesController
,并将此更改为同时呈现json:@messages并重试一次不好。BaseController类继承ApplicationController类。所以基本上是一样的,谢谢!在意识到这一点之前会浪费几个小时!这是正确的解决方案。永远不要降低宝石的等级。这对我来说没有任何改变。还有其他想法吗?