使用active_model_serializers序列化模型数组
我试图使用gem active_model_serializers
将模型的序列化版本作为参数发送到视图
#app/serializers/admin_serializer.rb class AdminSerializer 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
以上调试产生以下响应:
--- '{"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"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"},"instance_options":{},"root":null,"scope":null}'
在第一个调试中,我只序列化一个对象,而在第二个调试中,我正在尝试为一个对象数组执行此操作。 第一个调试正确地返回对象的序列化版本(以json_api格式),而第二个调试则没有。 尝试使用ArraySerializer,但没有成功: ActiveModel::Serializer::ArraySerializer.new(@admins, each_serializer: AdminSerializer).as_json
如何实现所需的序列化。 而且,如果实现了,我可以使用其他一些简化版吗? 因为这个调试语句太冗长了。
尝试了这里提到的所有解决方案 – 如何使用ActiveRecord :: Relation数组初始化ActiveModel :: Serializer类?
我试图解决的基本问题是,在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)
按照指南: 在控制器渲染之前进行序列化
你可以使用ActiveModel::SerializableResource.new(@admins, adapter: :json_api).to_json
在index.html.erb
<%= debug (ActiveModel::SerializableResource.new(@posts, adapter: :json_api).to_json) %>
以下是输出(使用post)
'{"data":[{"id":"1","type":"posts","attributes":{"title":"first post","body":null}},{"id":"2","type":"posts","attributes":{"title":"second post","body":null}}],"links":{}}
- rail3 / rspec / devise:除非我添加一个dummy = subject.current_user.inspect,否则rspec控制器测试失败
- 表内/表行之间的Bootstrap崩溃不起作用
- 使用Rspec测试ActiveModel :: Serializer类
- 在activemodel序列化程序中使用带有条件的属性
- ActiveModel Serializers:has_many在运行时有条件吗?
- 强制活动模型序列化程序返回关联
- 如何使用active_model_serializers为嵌套对象选择序列化程序
- 在Rails中使用ActiveModel :: Serializer – JSON数据在json和index响应之间有所不同
- Rails ActiveModelSerializer将两个相同类型模型的列表组合成一个序列化响应,具有不同的名称
- <NoMethodError:#Record :: ActiveRecord_Relation的未定义方法`read_attribute_for_serialization':
- 渴望与Active Model Serializers加载关联