在我的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
您可以尝试仅选择所需的字段吗?例如
Signup.where(user_id: current_user.id).select(:id, :comments, :status, :user_id)