В моем Grape API к одной и той же модели могут обращаться разные контроллеры и конечные точки. Мне нужно сериализовать одну и ту же модель для каждого из них, но не каждый атрибут применяется ко всем конечным точкам. Я знаю, что есть метод «фильтра», но это удаляет атрибут. Я хотел бы перечислить действительные атрибуты вместо этого. Это кажется безопаснее. Я разобрался в следующем подходе. Однако есть ли встроенный способ, который мне не хватает?
Используя приведенный ниже код, я хотел бы вернуть "id, comments, status, user_id", если он вызывается конечной точкой "/ event_signups". Я хотел бы вернуть "id, comments, event_id", если он вызывается конечной точкой "/ user_signups".
Сериализатор
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
Конечные точки API Grape
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