RocketPants和ActiveModelSerializers自定义序列化程序

时间:2013-12-05 21:39:35

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

该死的,那是我的......

引自RocketPants git:

  

支持active_model_serializers - 如果您想使用ActiveModelSerializers,我们会照顾它。更好的是,在您的公开调用中,按预期传递:serializer,我们将自动为您调用它。

这就是我尝试做的事情:

def friends
    @user = User.find_by_id(params[:id])
    expose @user.friends.first(params[:limit].to_i), serializer: UserJustNameSerializer
end

这就是我在user_serializer.rb中实现序列化的方式:

class UserSerializer < ActiveModel::Serializer
....
end

class UserJustNameSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :full_name, :avatar_thumb

  def avatar_thumb
    object.avatar.url(:thumb)
  end
end

使用不expose选项的serializer正在根据UserSerializer正确准备JSON。尝试使用UserJustNameSerializer会出现此错误:

NameError (uninitialized constant Api::V1::UsersController::UserJustNameSerializer)

所以问题是:如何正确显示RocketPants到序列化程序的方式?现在它正试图在UsersController中找到它。

1 个答案:

答案 0 :(得分:2)

所以,一如既往,只有在发布问题后我才能回答=)

解决方案是: 将UserJustNameSerializer放入其自己的文件user_just_name_serializer.rb并使用each_serializer:而不是serializer:,因为我正在尝试序列化数组,而不是单个对象。

对于谷歌的人:如果我在数组上使用serializer: UserJustNameSerializer,我会得到

NoMethodError (undefined method `read_attribute_for_serialization' for []:Array):