ActiveModelSerializers:camel_lower配置不起作用

问题描述

我想利用AMS创建json数据作为GraphQL变量传递到我的测试套件中。显然,它支持> | avg_time | > | :------- | > | 00:00:18 | ,它将把:camel_lower之类的哈希键转换为:some_field,但我似乎无法使其正常工作。以下是相关代码

/config/initializers/active_model_serializers.rb:

:someField

/app/serializers/service_serializer.rb:

ActiveModelSerializers.config.key_transform = :camel_lower

Rails控制台:

class ServiceSerializer < ApplicationSerializer
  attributes :id,:name,:time_increment
end

我期望的结果是:

ActiveModelSerializers.config.key_transform
 => :camel_lower 
s = Service.new(name: 'Test',time_increment: 10)
 => #<Service id: nil,name: "Test",time_increment: 10,created_at: nil,updated_at: nil> 
ss = ServiceSerializer.new(s)
 => #<ServiceSerializer:0x00007f3771dd9dc0 @object=#<Service id: nil,updated_at: nil>,@instance_options={},@root=nil,@scope=nil> 
ss.as_json
 => {:id=>nil,:name=>"Test",:time_increment=>10} 

解决方法

ActiveModelSerializers处于某种维护状态已经很长时间了,似乎没有收到任何更新。

我个人的选择是blueprinter宝石或jsonapi-serializersblueprinter距离AMS更近。

使用起来非常容易

# Gemfile
gem 'blueprinter'

和通常的

bundle install

创建序列化器非常简单

# e.g. app/blueprinter/service_blueprint.rb
class ServiceBlueprint < Blueprinter::Base
  # identifier :id

  fields :id,:name,:time_increment
end

添加课程LowerCamelTransformer

# e.g. app/blueprinter/lower_camel_transformer.rb
class LowerCamelTransformer < Blueprinter::Transformer
  def transform(hash,_object,_options)
    hash.transform_keys! { |key| key.to_s.camelize(:lower).to_sym }
  end
end

config/initializers/blueprinter.rb

Blueprinter.configure do |config|
  config.default_transformers = [LowerCamelTransformer]
end

测试

s = Service.find(1)
puts ServiceBlueprint.render(s)
# Will give you a nice output with lower camel case 
,

使用

ActiveModelSerializers.config.adapter = :json 它对我有用