Rails,葡萄实体。按条件曝光

Rails, Grape entity. Expose on condition

我创建了葡萄实体:

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

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

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

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

您有点误解了 :typeGrape::Entity 中的作用。它不是指公开的 class,而是您传递给 present 的调用的选项。它可能不适合您的目的,除非您总是知道要发送到 present 的对象的 class(我猜情况可能并非总是如此,并且您在这里有一些多态性)。

我想你只是想要这个:

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

Grape::Entity 将尝试 属性 并在不可用或引发错误时优雅地失败。

如果您要使用的其他 class 确实具有 health 属性,但您想隐藏这些值,则可以使用 [=19] 的块形式=]:

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

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

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

如果你根本不想显示 class 现有的 health 属性 而不是 Basis