3

我想手动序列化一个集合以进行测试。我试过这个:

JSONAPI::ResourceSerializer.new(PostResource).
  serialize_to_hash(PostResource.new(Post.all))

这行不通。看来您只能在此处序列化单个资源。如何返回所有帖子的序列化集合?

4

3 回答 3

3

我正在尝试同样的事情 - 但这是不可能的。JSONAPI::Resource 没有任何帮助器可以轻松地将 Relation 对象或记录数组转换为 JSONAPI::Resource 实例,因此您不能像这样传递集合。

serialize_to_hash 需要 JSONAPI::Resource 数组,所以你必须做这样可怕的事情:

result = []
Post.all.each do |post|
  result << PostResource.new(post)
end

JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(result)

JSONAPI::Resources 期望 JSONAPI 本身就足够了,因此不需要像 index 这样的方法的实现——gem 会自己处理它,而不需要手动序列化。但确实,我可以想象一些场景,我希望能够手动序列化记录集合,所以应该有一些简单的方法来做到这一点......不幸的是,看起来没有简单的方法现在。

更新:我自己还有一些问题,所以我在这里询问了 gem 的创建者:https ://github.com/cerebris/jsonapi-resources/issues/460

于 2015-09-25T15:17:06.043 回答
0

另一种基于 JSONAPI 资源特性手动序列化数据的方法是使用jsonapi-utils gem:

使用jsonapi_serialize方法:

class API::V1::UsersController < API::V1::BaseController
  def index
    users = User.all 
    render json: jsonapi_serialize(users)
  end
end

或高级jsonapi_render方法:

class API::V1::UsersController < API::V1::BaseController
  def index
    jsonapi_render json: User.all
  end
end

希望它对你有用:-)

于 2015-12-29T00:18:12.203 回答
0

如果您使用ActiveModelSerializers ( https://github.com/rails-api/active_model_serializers )

尝试做这样的助手:

def serialize_resource(resource)
  JSON.parse(ActiveModelSerializers::SerializableResource.new(resource).to_json)
end

您可以将此模式用于一个资源或多个资源。在您的情况下,它将是:

JSON.parse(ActiveModelSerializers::SerializableResource.new(Post.all).to_json)
于 2016-12-12T09:46:13.197 回答