每种方法设置Active Model序列化程序适配器

时间:2016-11-20 12:50:41

标签: ruby-on-rails-5 active-model-serializers

我正在尝试在rails 5中构建一个仅支持api的应用。我使用的是活动模型序列化器(AMS)。 在我的 Call<VKSongApi> call = apiService.search("test","fff9ef502df4bb10d9bf50dcd62170a24c69e98e4d847d9798d63dacf474b674f9a512b2b3f7e8ebf1d69"); call.enqueue(new Callback<VKSongApi>() { @Override public void onResponse(Call<VKSongApi> call, Response<VKSongApi> response) { int statusCode = response.code(); VKSongApi song = response.body(); Log.d(TAG,response.message()); } @Override public void onFailure(Call<VKSongApi> call, Throwable t) { //Here the error occurs com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 20 path $.response[0] Log.d(TAG,"Failure"); } }); (UsersController#index)端点上,我希望根json有一个&#34;用户&#34; json用户数组之前的关键字。

如果我设置了一个GET /users值的初始值设定项,那么我就有了所需的行为。

但是,在ActiveModelSerializers.config.adapter = :json 上,简单用户json位于密钥GET /users/1下。我想摆脱这个键(在这种情况下)并简单地回答用户json作为根json。

问题是:如何在特定端点/响应/方法上定义AMS适配器?这可能吗?

1 个答案:

答案 0 :(得分:2)

我应该阅读手册:$

覆盖&#34; root&#34;键,您必须在调用root:方法时提供render参数。如果您在初始化程序中使用:json适配器,它将是这样的:

render json: @user, root: "admin" 然后这将生成一个像这样的json:

{     &#34; admin&#34;:{       &#34; id&#34;:123,       &#34;电子邮件&#34;:&#34; email@example.com"     }   }

如果需要,您还可以在root:之后提供另一个密钥来设置适配器,如下所示:adapter: :json

因此,:attributes适配器没有根密钥。要删除根密钥,您可以执行以下操作: render json: @user, root: "admin", adapter: :attributes

官方文档为herehere