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
,但它也不起作用。我做错了什么???
您有点误解了 :type
在 Grape::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
我创建了葡萄实体:
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
,但它也不起作用。我做错了什么???
您有点误解了 :type
在 Grape::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