Rails 5 API-如何使用Active Model Serializer为同一模型创建和使用自定义序列化程序

时间:2019-03-08 16:44:40

标签: active-model-serializers rails-api ruby-on-rails-5.2

如何为同一模型创建自定义序列化程序? 我已经ShopSerializer定义如下:

#serializers/shop_serializer.rb

class ShopSerializer < ActiveModel::Serializer
  attributes :category,:name, ...#other attributes

  belongs_to :country
end

我想定义一个包含所有关系的自定义项:

module Api
  class ShopSerializer < ActiveModel::Serializer
    attributes :category, ... other attributes

    belongs_to :country
    has_one :address
    has_one :client_relation
    has_many :events
    has_many :services
    has_many :descriptions
  end
end

controllers/v1/api/shops_controller.rb中:

module V1
  module Api
    class ShopsController < ApiController

      def show
        @shop = Shop.some_fancy_method(params[:identifier])
        render jsonapi: @shop, serializer: Api::ShopSerializer
      end
    end
  end
end

,它失败并显示:

#<NoMethodError: undefined method `read_attribute_for_serialization' for #<Shop::ActiveRecord_Relation:0x00007f8e07d5cd88>>",

这是怎么回事?我想念什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

#<NoMethodError: undefined method `read_attribute_for_serialization' for #<Shop::ActiveRecord_Relation:0x00007f8e07d5cd88>>"

表示您要序列化包含商店内部的活动关系,而不仅仅是商店本身。

@shop应该返回单数商店吗?如果是这样,那么:

render jsonapi: @shop.first, serializer: Api::ShopSerializer

应该可以,但是显然最好首先修复@shop变量