仅根据具体操作使用ActiveModel和Grape API序列化特定属性

问题描述 投票:0回答:1

在我的Grape API中,相同的模型可以由不同的控制器和端点访问。我需要为它们每个序列化相同的模型,但不是每个属性都适用于所有端点。我知道有“过滤器”方法,但这会删除一个属性。我想列出有效的属性。这似乎更安全。我想出了以下方法。但是,有没有我想念的内置方式?

使用下面的代码,如果由“ / event_signups”端点调用,我想返回“ id,注释,状态,user_id”。如果要由“ / user_signups”端点调用,我想返回“ id,评论,event_id”。

Serializer

module Mobile
  module V4

    class SignupSerializer < ActiveModel::Serializer

      attributes :id,
                 :comments,
                 :status,
                 :event_id,
                 :user_id

      attribute :id,       if: :id?
      attribute :comments, if: :comments?
      attribute :status,   if: :status?
      attribute :event_id, if: :event_id?
      attribute :user_id,  if: :user_id?

      def id?
        !instance_options[:allowed_attributes].index(:id).nil?
      end

      def comments?
        !instance_options[:allowed_attributes].index(:comments).nil?
      end

      def status?
        !instance_options[:allowed_attributes].index(:status).nil?
      end

      def event_id?
        !instance_options[:allowed_attributes].index(:event_id).nil?
      end

      def user_id?
        !instance_options[:allowed_attributes].index(:user_id).nil?
      end

    end

  end
end

Grape API端点

module Mobile
  module V4
    class Signups < Mobile::V4::Root
      include Mobile::V4::Defaults

      resource :signups, desc: 'Operations about the signups' do

        desc 'Returns list of user's signups'
        oauth2 # This endpoint requires authentication

        get '/user_signups', allowed_attributes: [:id, :comments, :event_id] do
          Signup.where(user_id: current_user.id)
        end

        desc 'Returns list of event's signups'
        params do
          requires :event_id, type: Integer, desc: 'Event ID'
        end
        oauth2 # This endpoint requires authentication

        get '/event_signups', allowed_attributes: [:id, :comments, :status, :user_id] do
          Signup.where(event_id: params[:event_id])
        end

      end

    end

  end
end
ruby-on-rails active-model-serializers grape-api
1个回答
0
投票

您可以尝试仅选择所需的字段吗?例如

Signup.where(user_id: current_user.id).select(:id, :comments, :status, :user_id)
© www.soinside.com 2019 - 2024. All rights reserved.