【问题标题】:Is there a way to manually serialize a collection?有没有办法手动序列化一个集合?
【发布时间】:2015-12-17 14:44:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails json-api jsonapi-resources rspec-api-documentation


    【解决方案1】:

    如果您使用的是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)
    

    【讨论】:

      【解决方案2】:

      另一种基于 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
      

      希望对你有用:-)

      【讨论】:

        【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-03
          相关资源
          最近更新 更多