1

我创建了葡萄实体:

class VehicleDetails < Grape::Entity
  expose :id
  expose :name
  expose :type
  expose :health, if: {type: 'basis'}
end

:health如果电流:type等于 ,我想公开basis。我尝试通过这种方法访问它:

 get :details do
  present Basis.all, with: GameServer::Entities::VehicleDetails
 end

Health属性未显示在我创建的 json 中。我以为我可以使用expose :health, if: :health,它也不起作用。我做错了什么???

4

1 回答 1

3

您对 inside 的作用略有:type误解Grape::Entity。它不是指正在公开的类,而是您将调用传递给present. 它可能不适合您的目的,除非您始终知道要发送到的对象的类别present(我猜可能并非总是如此,并且您在这里有一些多态性)。

我想你只是想要这个:

class VehicleDetails < Grape::Entity
  expose :id
  expose :name
  expose :type
  expose :health
end

Grape::Entity如果它不可用或引发错误,将尝试一个属性并优雅地失败。

如果您要使用的其他类确实具有该health属性,但您想隐藏这些值,则可以使用以下的块形式expose

class VehicleDetails < Grape::Entity
  expose :id
  expose :name
  expose :type
  expose( :health ) do |vehicle,opts| 
    vehicle.is_a?( Basis ) ? vehicle.health : nil
  end
end

或者你可以传递一个 RubyProc作为条件:

class VehicleDetails < Grape::Entity
  expose :id
  expose :name
  expose :type
  expose :health, :if => Proc.new {|vehicle| vehicle.is_a?( Basis )}
end

如果您根本不想为health拥有它的类显示现有属性,那么最后一个可能会更好Basis

于 2015-03-26T06:35:11.437 回答