ruby-on-rails – 使用active_model_serializers序列化一组模型

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用active_model_serializers序列化一组模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用gem active_model_serializers将模型的序列化版本作为参数发送到视图
#app/serializers/admin_serializer.rb
class AdminSerializer < ActiveModel::Serializer
  attributes :id,:email,:access_locked?
end


#app/controllers/dashboard/admins_controller.rb
  def index
    @search = Admin.search(params[:q])
    @admins = @search.result(:distinct => true).page(params[:page]).per(10)

    @page_entries_info = view_context.page_entries_info @admins
    # render json: @admins
    respond_to do |format|
      format.html
      format.js
      format.json {render json: @admins}
    end
  end



#app/views/dashboard/admins/index.html.erb
  <%= debug (ActiveModel::Serializer::Adapter.adapter_class(:json_api).new(ActiveModel::Serializer.serializer_for(@admins.first).new(@admins.first),{}).to_json) %>
  <%= debug (@admins.all.map{|admin| AdminSerializer.new(admin).to_json}) %>

以上调试产生以下响应:

--- '{"data":{"id":"1","type":"admins","attributes":{"email":"tech@bluesapling.com","access_locked?":false}}}' //returned by the first debug


---
- '{"object":{"id":36,"email":"aubrey_schmitt@feeneykoch.io","created_at":"2016-03-28T05:15:17.546Z","updated_at":"2016-03-28T05:15:17.546Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":20,"email":"alysa_johnston@thompson.io","created_at":"2016-03-28T05:15:16.304Z","updated_at":"2016-03-28T05:15:16.304Z"},"scope":null}'
- '{"object":{"id":22,"email":"kristofer.langosh@kunzeluettgen.com","created_at":"2016-03-28T05:15:16.459Z","updated_at":"2016-03-28T05:15:16.459Z"},"scope":null}'
- '{"object":{"id":37,"email":"beryl_keler@wiza.biz","created_at":"2016-03-28T05:15:17.624Z","updated_at":"2016-03-28T05:15:17.624Z"},"scope":null}'
- '{"object":{"id":5,"email":"wilhelmine_buckridge@crona.io","created_at":"2016-03-28T05:15:15.139Z","updated_at":"2016-03-28T05:15:15.139Z"},"scope":null}'
- '{"object":{"id":14,"email":"edward_wisoky@corkery.net","created_at":"2016-03-28T05:15:15.838Z","updated_at":"2016-03-28T05:15:15.838Z"},"scope":null}'
- '{"object":{"id":27,"email":"leonor@jerde.biz","created_at":"2016-03-28T05:15:16.848Z","updated_at":"2016-03-28T05:15:16.848Z"},"scope":null}'
- '{"object":{"id":2,"email":"carley@wyman.net","created_at":"2016-03-28T05:15:14.873Z","updated_at":"2016-03-28T05:15:14.873Z"},"scope":null}'
- '{"object":{"id":10,"email":"ervin.gleichner@cremin.org","created_at":"2016-03-28T05:15:15.527Z","updated_at":"2016-03-28T05:15:15.527Z"},"scope":null}'
- '{"object":{"id":15,"email":"lonzo.dickens@johnscole.name","created_at":"2016-03-28T05:15:15.916Z","updated_at":"2016-03-28T05:15:15.916Z"},"scope":null}'

在第一个调试中,我只序列化一个对象,而在第二个调试中,我正在尝试为一个对象数组执行此操作.
第一个调试正确地返回对象的序列化版本(以json_api格式),而第二个调试则没有.
尝试使用ArraySerializer,但没有成功:ActiveModel :: Serializer :: ArraySerializer.new(@admins,each_serializer:AdminSerializer).as_json
如何实现所需的序列化.而且,如果实现了,我可以使用其他一些简化版吗?因为这个调试语句太冗长了.

尝试了这里提到的所有解决方案 – How do you initialize an ActiveModel::Serializer class with an ActiveRecord::Relation array?

我试图解决的基本问题是,在Admin控制器的索引方法中,Admin对象作为PORO传递给index.html文件.但我想要这个对象的序列化json版本,以便我可以将它作为prop传递给我的react组件

index方法http://dashboard.localhost.com:3000/admins.json发射时渲染正确的json

索引方法更新#1

def index
    @search = Admin.search(params[:q])
    @admins_array = @search.result(:distinct => true).to_a
    if params[:page]
      @admins = @search.result(:distinct => true).page(params[:page][:number]).per(10)
      @admins_json_array = Kaminari.paginate_array(@admins_array).page(params[:page][:number]).per(10)
    else
      @admins = @search.result(:distinct => true).page(1).per(10)
      @admins_json_array = Kaminari.paginate_array(@admins_array).page(1).per(10)
    end
    @admins_json = ActiveModel::SerializableResource.new(@admins_json_array.to_a)
    ...
    ...
    ...
end

解决方法

由于需要默认序列化程序的不同属性,我需要指定序列化程序的控制器.

在控制器中:

def index
    search = User.ransack(search_params)
    render json: search.result,each_serializer: MembershipRenewalSerializer::MemberSerializer
  end

所以,只是为了让事情有效,如果指定each_serializer选项会发生什么?

编辑:

外部控制器:

ActiveModel::SerializableResource.new(
  User.first(2),each_serializer: MembershipRenewalSerializer::MemberSerializer
).to_json

注意,如果没有指定each_serializer,SerializableResource将使用UserSerializer.

编辑#2,

看起来@admins数据发生了一些奇怪的事情.

尝试转换为数组:

ActiveModel::SerializableResource.new(@admins.to_a).to_json

编辑#3

要对数组进行分页,请尝试以下操作:

@search = Admin.search(params[:q])
@results = @search.result(:distinct => true).to_a
@admins = Kaminari.paginate_array(@results).page(params[:page]).per(10)

猜你在找的Ruby相关文章