テスト目的でコレクションを手動でシリアライズしたいと考えています。私はこれを試しました:
JSONAPI::ResourceSerializer.new(PostResource).
serialize_to_hash(PostResource.new(Post.all))
これはうまくいきません。ここでは単一のリソースしかシリアル化できないようです。すべての投稿のシリアル化されたコレクションを返すにはどうすればよいでしょうか?
テスト目的でコレクションを手動でシリアライズしたいと考えています。私はこれを試しました:
JSONAPI::ResourceSerializer.new(PostResource).
serialize_to_hash(PostResource.new(Post.all))
これはうまくいきません。ここでは単一のリソースしかシリアル化できないようです。すべての投稿のシリアル化されたコレクションを返すにはどうすればよいでしょうか?
私は同じことを試みていましたが、それは不可能です。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 は、手動のシリアル化を必要とせずにそれ自体を処理します。しかし、レコードのコレクションを手動でシリアル化できるようにしたいいくつかのシナリオを想像できるのは事実です。そのため、これを行う簡単な方法があるはずです...残念ながら、簡単な方法はないようです今。
更新: 私は自分自身にさらに質問があったので、ここで宝石の作成者に尋ねました: https://github.com/cerebris/jsonapi-resources/issues/460
ActiveModelSerializersを使用している場合( https://github.com/rails-api/active_model_serializers )
次のようにヘルパーを実行してみてください。
def serialize_resource(resource)
JSON.parse(ActiveModelSerializers::SerializableResource.new(resource).to_json)
end
このパターンは、1 つのリソースまたは複数のリソースの両方に使用できます。あなたの場合は次のようになります。
JSON.parse(ActiveModelSerializers::SerializableResource.new(Post.all).to_json)
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
お役に立てば幸いです:-)